国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java集合框架(Collection Framework)學習之 HashMap

2019-11-14 23:26:39
字體:
來源:轉載
供稿:網友
java集合框架(Collection Framework)學習之 HashMap從API文檔可以得到HashMap的以下幾個特點:
  • 基于哈希表(hash table)實現,并且是鏈式哈希表
  • 允許空值和空鍵(null=null 鍵值對)
  • HashMap與Hashtable基本相同,區別是HashMap是非同步、非線程安全的,并且可以支持空值
  • HashMap是無序的:HashMap不保證元素的順序,也不保證元素的順序會保持不變
  • O(1)的時間效率:它對get和put基本操作提供了常數時間(constant-time)的性能
  • 影響HashMap性能的兩個參數:初始化容量和負載因子(load factor)。不要把初始化容量設的太大,也不要把負載因子設的太小 。為了更好地權衡時間和空間消耗,默認的負載因子一般為0.75。默認的容量是16。
  • 當哈希表里的entry(鍵值對)超過一定閾值(threshold=capacity*factor)時,哈希表會進行再哈希(rehash)。再哈希后的哈希表的桶的個數之前的兩倍 。
使用選擇

Hashtable 從jdk1.0就有了,而HashMap是jdk1.2添加了,ConcurrentHashMap在jdk1.5才提供。Hashtable和ConcurrentHashMap都是線程安全的。但是ConcurrentHashMap是1.5添加的更高級的并發工具。它使用了分段鎖技術來實現更細粒度的同步。因此ConcurrentHashMap比Hashtable效率較高,因此在多線程情況下一般使用ConcurrentHashMap。而HashMap是非線程安全的,因此一般在單線程下使用。

優先選擇:多線程訪問:ConcurrentHashMap。單線程訪問:HashMap

驗證

寫個簡單易懂的代碼作為例子,代碼如下,然后分別在有注釋的兩行代碼前設置斷點:

public class HashMapL {public static void main(String[] args) {HashMap<Integer, Integer> hashMap = new HashMap<>();hashMap.put(null, null);  //test null key and null value;for(int i=0; i<16; i++){hashMap.put(i, i);  //autoboxing}}

以debug模式運行上面代碼可以看出HashMap hashMap = new HashMap<>();初始化了如下的hashMap:

從上圖可以看到,負載因子loadfactor默認值是0.75。注意,threshold現在的值時0。根據HashMap源碼里面的注釋可以知道,這個值是在給table分配空間后才會計算threshold的值,分配前它的值是0,而現在table的值為null,尚未分配。那么這里的table是什么呢?了解拉鏈式哈希表的人就會輕易知道它是一個鏈表數組。

按F6執行下一步,給hashMap賦值,并且是空值,來驗證與Hashtable的區別:可以保存空值。

從上圖可以看到,

  1. 現在table已經初始化了,它現在擁有一個元素 "null=null"(從圖片最下面可以看成)。
  2. 它是一個包含16個元素的Node類型數組
  3. 記住,現在table的id=24,可以和之后進行再哈希后的tableid對比。

繼續按F6,直到size=threshold=12,此刻table的id和之前的一樣,還是id=24

現在再按一次F6執行下一步,向hashMap里添加一個元素,讓元素的總數size大于閾值threshold

從圖片中看到,table的id=104,大小為32,閾值threshold=24。而之前的id=24,大小為16,threshold=12。因此得出結論,

當元素大小size大于閾值threshold時就會進行再哈希。再哈希后,HashMap就會自動擴容為之前的2倍。并且用一個新的對象代替原來的對象。由此也可得知,自動擴容是需要消耗資源的,要盡量減少自動擴容的發生。
參考:

API文檔How HashMap works in java,強烈推薦!(之前看了這篇文章感覺真的太好了,有種自己不用寫了感覺。所以這篇博文最主要的目的是總結下HashMap的特點。和這篇文章的debug思路)


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 烟台市| 团风县| 安福县| 东港市| 永顺县| 芦山县| 宁陕县| 佛学| 将乐县| 安岳县| 阳东县| 凤冈县| 砚山县| 九江市| 万安县| 环江| 淮安市| 石台县| 太保市| 乌兰县| 吉林市| 藁城市| 饶平县| 怀柔区| 通辽市| 石泉县| 绥江县| 西吉县| 宁城县| 甘南县| 星子县| 资中县| 江西省| 盐边县| 始兴县| 浙江省| 昌平区| 定襄县| 长汀县| 广宁县| 拉萨市|