天道不一定酬所有勤
但是,天道只酬勤

為啥HashMap的默認容量是16?

開發十年,就只剩下這套架構體系了??!

集合是Java開發日常開發中經常會使用到的,而作為一種典型的K-V結構的數據結構,HashMap對于Java開發者一定不陌生。

在日常開發中,我們經常會像如下方式以下創建一個HashMap:

Map<String, String> map = new HashMap<String, String>();

但是,大家有沒有想過,上面的代碼中,我們并沒有給HashMap指定容量,那么,這時候一個新創建的HashMap的默認容量是多少呢?為什么呢?

本文就來分析下這個問題。

什么是容量

在Java中,保存數據有兩種比較簡單的數據結構:數組和鏈表。數組的特點是:尋址容易,插入和刪除困難;而鏈表的特點是:尋址困難,插入和刪除容易。HashMap就是將數組和鏈表組合在一起,發揮了兩者的優勢,我們可以將其理解為鏈表的數組。

在HashMap中,有兩個比較容易混淆的關鍵字段:size和capacity ,這其中capacity就是Map的容量,而size我們稱之為Map中的元素個數。

簡單打個比方你就更容易理解了:HashMap就是一個“桶”,那么容量(capacity)就是這個桶當前最多可以裝多少元素,而元素個數(size)表示這個桶已經裝了多少元素。

-w778

如以下代碼:

Map<String, String> map = new HashMap<String, String>();
map.put("hollis", "hollischuang");

Class<?> mapType = map.getClass();
Method capacity = mapType.getDeclaredMethod("capacity");
capacity.setAccessible(true);
System.out.println("capacity : " + capacity.invoke(map));

Field size = mapType.getDeclaredField("size");
size.setAccessible(true);
System.out.println("size : " + size.get(map));

輸出結果:

capacity : 16、size : 1

上面我們定義了一個新的HashMap,并想其中put了一個元素,然后通過反射的方式打印capacity和size,其容量是16,已經存放的元素個數是1。

通過前面的例子,我們發現了,當我們創建一個HashMap的時候,如果沒有指定其容量,那么會得到一個默認容量為16的Map,那么,這個容量是怎么來的呢?又為什么是這個數字呢?

容量與哈希

要想講清楚這個默認容量的緣由,我們要首先要知道這個容量有什么用?

Hollis為了防爬蟲以及未經授權的惡意轉載,此處內容已被作者隱藏,請輸入驗證碼查看內容
驗證碼:
請關注本站微信公眾號,回復“驗證碼”,獲取驗證碼。在微信里搜索“Hollis”或者“hollischuang”或者微信掃描右側二維碼都可以關注本站微信公眾號。

(全文完) 歡迎關注『Java之道』微信公眾號
贊(4)
如未加特殊說明,此網站文章均為原創,轉載必須注明出處。HollisChuang's Blog » 為啥HashMap的默認容量是16?
分享到: 更多 (0)

評論 2

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址
  1. #1

    博主,為何文檔是有密碼的呀?

    Michael翔2個月前 (12-08)回復
  2. #2

    我也不知道為什么

    森純博客2個月前 (12-19)回復

HollisChuang's Blog

聯系我關于我
大乐透复式返奖 南宁麻将算法图 大唐国际棋牌下载 11选5傻瓜打法 捕鱼平台注册送20000分 澳门棋牌网上娱乐 加拿大快乐8是哪三个数 数据港股票 20选五走势图带连线 25选5开奖结果201760 捕鱼达人无限金单机版