摘要:采用鏈地址法來處理沖突這個就被賦值到里面去了。的應用非常廣泛,是新框架中用來代替的類,也就是說建議使用,不要使用的方法是同步的,未經同步直接使用對象的中數組默認大小是,增加的方式是。中數組的默認大小是,而且一定是的指數
Hashmap采用鏈地址法來處理沖突:
void addEntry(int hash, K key, V value, int bucketIndex) { if ((size >= threshold) && (null != table[bucketIndex])) { resize(2 * table.length); hash = (null != key) ? hash(key) : 0; bucketIndex = indexFor(hash, table.length); } createEntry(hash, key, value, bucketIndex); } void createEntry(int hash, K key, V value, int bucketIndex) { Entrye = table[bucketIndex]; table[bucketIndex] = new Entry<>(hash, key, value, e); size++; }
這個e就被賦值到next里面去了。
get的時候也是用鏈表來個get:
final EntrygetEntry(Object key) { if (size == 0) { return null; } int hash = (key == null) ? 0 : hash(key); for (Entry e = table[indexFor(hash, table.length)]; e != null; e = e.next) { //注意這個大的for循環。循環一個鏈棧。next自然就在里面 Object k; if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) return e; } return null; }
HashMap產生的原因是不同的key會產生相同的數組下標地址。數組下標地址里面存了鏈表。查詢的時候,先table[indexFor(hash, table.length)]找到數組下標,再根據key來尋找結果。
http://zhangshixi.iteye.com/blog/672697
什么是加載(裝載因子):
加載因子是表示Hsah表中元素的填滿的程度.若:加載因子越大,填滿的元素越多,好處是,空間利用率高了,但:沖突的機會加大了.反之,加載因子越小,填滿的元素越少,好處是:沖突的機會減小了,但:空間浪費多了.
沖突的機會越大,則查找的成本越高.反之,查找的成本越小.因而,查找時間就越小.
因此,必須在 "沖突的機會"與"空間利用率"之間尋找一種平衡與折衷. 這種平衡與折衷本質上是數據結構中有名的"時-空"矛盾的平衡與折衷.
loadfactor默認0.75,就是說差不多快滿(默認取3/4)的時候重新hash/resize,這樣可以避免hashmap里面每個table元素上的鏈表長度過長,影響hashmap的效率;
默認加載因子,加載因子是一個比例,當HashMap的數據大小>=容量*加載因子時,HashMap會將容量擴容
static final float DEFAULT_LOAD_FACTOR = 0.75f;
當實際數據大小超過threshold時,HashMap會將容量擴容,threshold=容量*加載因子
int threshold;
threshold是每次都要計算好的值。(擴容一次就計算一次)
HashMap本身存儲的也是數組。。
Hashtable的應用非常廣泛,HashMap是新框架中用來代替Hashtable的類,也就是說建議使用HashMap,不要使用Hashtable
1.Hashtable的方法是同步的,HashMap未經同步
2.Hashtable直接使用對象的hashCode
3.Hashtable中hash數組默認大小是11,增加的方式是 old*2+1。HashMap中hash數組的默認大小是16,而且一定是2的指數
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65309.html
摘要:線程安全是線程安全的,不是線程安全的。是添加的,貌似沒人用過這個,棧長我也沒用過。。最后一點有幾個人知道知道的給棧長點個贊回應一下,不知道的有收獲的也點一個贊支持一下吧。 HashMap 和 Hashtable 是 Java 開發程序員必須要掌握的,也是在各種 Java 面試場合中必須會問到的。 但你對這兩者的區別了解有多少呢? 現在,棧長我給大家總結一下,或許有你不明朗的地方,在棧長...
摘要:與中的類似,也是一個數組加鏈表,不過這個線程安全。線程安全,但是它的線程安全是依賴將所有修改的代碼塊都用修飾。這是中實現線程安全的思路,由個組成,每個就相當于一個數組鏈表。線程安全,但性能差,不推薦使用。 問題描述 翻翻別人的面試經歷 這里在知乎上看到的,分享出了自己面試阿里Java崗的面試題。 showImg(https://segmentfault.com/img/bVbfSZ5?...
摘要:的函數都是同步的,這意味著它是線程安全的。直接使用對象的。是的輕量級實現非線程安全的實現都完成了接口,主要區別在于能否鍵對值能為。同時其內部方法有區別中將的方法去掉了,改為和避免混淆。支持的遍歷種類不同只支持迭代器遍歷。 java在數據結構中的映射定義了一個接口java.util.Map。 Map包含三個實現類HashMap、Hashtable、TreeMap。Map是用來存儲鍵對值 ...
摘要:中的使用及在中的沖突方案引言簡稱是在作為的替代選擇新引入的,是包的重要成員。為了解決在頻繁沖突時性能降低的問題,中使用平衡樹來替代鏈表存儲沖突的元素。目前,只有和會在頻繁沖突的情況下使用平衡樹。 java中ConcurrentHashMap的使用及在Java 8中的沖突方案 1、引言 ConcurrentHashMap(簡稱CHM)是在Java 1.5作為Hashtable的替代選擇新...
摘要:底層的數據結構就是數組鏈表紅黑樹,紅黑樹是在中加進來的。負載因子哈希表中的填滿程度。 前言 把 Java 容器的學習筆記放到 github 里了,還在更新~其他的目前不打算抽出來作為文章寫,感覺挖的還不夠深,等對某些東西理解的更深了再寫文章吧Java 容器目錄如下: Java 容器 一、概述 二、源碼學習 1. Map 1.1 HashMap 1.2 LinkedHashM...
閱讀 649·2021-11-11 16:55
閱讀 2160·2021-11-11 16:55
閱讀 1951·2021-11-11 16:55
閱讀 2341·2021-10-25 09:46
閱讀 1598·2021-09-22 15:20
閱讀 2270·2021-09-10 10:51
閱讀 1703·2021-08-25 09:38
閱讀 2613·2019-08-30 12:48