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