hashmap和hashtable(java的hashmap和hashtable)
夕逆IT
- 開(kāi)發(fā)語(yǔ)言
- 2023-08-13
- 95

大家好,今天給各位分享hashmap和hashtable的一些知識(shí),其中也會(huì)對(duì)java的hashmap和hashtable進(jìn)行解釋?zhuān)恼缕赡芷L(zhǎng),如果能碰巧解決你現(xiàn)...
大家好,今天給各位分享hashmap和hashtable的一些知識(shí),其中也會(huì)對(duì)java的hashmap和hashtable進(jìn)行解釋?zhuān)恼缕赡芷L(zhǎng),如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在就馬上開(kāi)始吧!
concurrenthashmap1.8底層原理
1.8底層原理主要包括以下幾個(gè)方面:
2.CAS操作:ConcurrentHashMap使用CAS操作(CompareAndSwap)來(lái)實(shí)現(xiàn)線程安全,而不是像HashTable一樣使用synchronized關(guān)鍵字。在put操作時(shí),首先會(huì)進(jìn)行一次判斷,如果當(dāng)前線程能夠獲取到鎖,則直接寫(xiě)入數(shù)據(jù);如果獲取不到鎖,則采用CAS操作,嘗試多次重試,直到寫(xiě)入成功為止。
3.數(shù)組+鏈表/紅黑樹(shù):ConcurrentHashMap使用數(shù)組+鏈表/紅黑樹(shù)的數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)鍵值對(duì),當(dāng)鏈表長(zhǎng)度超過(guò)一定閾值(默認(rèn)為8)時(shí),鏈表會(huì)轉(zhuǎn)化為紅黑樹(shù),以提高查詢(xún)效率。
4.原子性操作:ConcurrentHashMap的put、get、remove等操作都是原子性的,不需要手動(dòng)加鎖,可以保證線程安全。同時(shí),ConcurrentHashMap還提供了一些原子性的操作方法,如putIfAbsent、replace等。
5.自動(dòng)擴(kuò)容:ConcurrentHashMap的自動(dòng)擴(kuò)容與HashTable類(lèi)似,但是ConcurrentHashMap使用分段鎖設(shè)計(jì),可以對(duì)每個(gè)Segment獨(dú)立地進(jìn)行擴(kuò)容,不會(huì)對(duì)整個(gè)Map進(jìn)行鎖定,從而降低了鎖的競(jìng)爭(zhēng),提高了并發(fā)性能。
8底層原理主要包括以下幾個(gè)方面:
java面試題有哪些
肝了一個(gè)月的面試題終于來(lái)啦,大家開(kāi)心不。
2020年最新Java面試題整理,全網(wǎng)最全一份,包含各個(gè)技術(shù)棧,Java基礎(chǔ),Java集合,多線程,Java異常,spring,springMVC,springboot,springcloud,netty,dubbo,activemq,Javaweb,jvm,kafka,MongoDB,mybatis,MySQL,Nginx,rabbitmq,Redis,Tomcat,zookeeper,設(shè)計(jì)模式,數(shù)據(jù)結(jié)構(gòu),算法,分布式,限流,降級(jí),cap原理等等知識(shí)點(diǎn)
話(huà)不多說(shuō),直接上圖
總共80多個(gè)PDF
【BAT必備】計(jì)算機(jī)網(wǎng)絡(luò)面試題:
鏈接:https://pan.baidu.com/s/1hFggmtdL1ZmE4utBlo8S1g提取碼:qfkh
【BAT必備】設(shè)計(jì)模式面試題
鏈接:https://pan.baidu.com/s/1eXJveIVvQe-m3MdvLcT-fQ提取碼:j0kx
【BAT必備】數(shù)據(jù)結(jié)構(gòu)算法面試題:
鏈接:https://pan.baidu.com/s/1daFN9jY03fXsqwc9LeKi2w提取碼:5ab7
【BAT必備】多線程面試題:
鏈接:https://pan.baidu.com/s/1GdvsNESoHPBjWKN2h-iK7Q提取碼:cqib
【BAT必備】并發(fā)編程鎖面試題:
鏈接:https://pan.baidu.com/s/1hXPPtMY2dvz-g7QcSTc3PA提取碼:zhmy
【BAT必備】tomcat面試題:
鏈接:https://pan.baidu.com/s/1qPZXx4lmLynmaF0XjRTzpQ提取碼:5m16
【BAT必備】zookeeper面試題:
鏈接:https://pan.baidu.com/s/1EhOee9e1Qe-Q6RC8KlthxA提取碼:p2am
【BAT必備】spring全家桶面試題:
鏈接:https://pan.baidu.com/s/1DXGO-N5P6QIGKLZ8LIVOuQ提取碼:m9v7
【BAT必備】rocketMq面試題:
鏈接:https://pan.baidu.com/s/1TEF3yUR4OOaIpj-4ud_79A提取碼:3g3d
【BAT必備】redis面試題:
鏈接:https://pan.baidu.com/s/1qlanxWBfwvKUObnHulCQiA提取碼:rjo7
【BAT必備】rabbitMq面試題:
鏈接:https://pan.baidu.com/s/1ywLiq3IUJVyZosPLNrmyTA提取碼:0td4
【BAT必備】netty面試題:
鏈接:https://pan.baidu.com/s/1Pbv4aelqOt1dUPA2SwEB_Q提取碼:2w1e
【BAT必備】Nginx面試題:
鏈接:https://pan.baidu.com/s/1r8YNyOz0N6MJ9F0045lEZw提取碼:49tl
【BAT必備】MySQL面試題:
鏈接:https://pan.baidu.com/s/1GeX6Fs4nNi6fTUHKxJ2SZw提取碼:8pow
【BAT必備】mybatis面試題:
鏈接:https://pan.baidu.com/s/1xOYiaiQ2JpPt2jb6GdWjaA提取碼:aqd3
【BAT必備】MongoDB面試題:
鏈接:https://pan.baidu.com/s/1QTVx1TF8tDn6LUJr7wdfOQ提取碼:j1qt
【BAT必備】Linux面試題:
鏈接:https://pan.baidu.com/s/1veZ3dBJmz1PduCE5tl-e1A提取碼:txpf
【BAT必備】kafka面試題:
鏈接:https://pan.baidu.com/s/1SWhiBCswleYGsDupSGzE6g提取碼:o1gv
【BAT必備】jvm面試題:
鏈接:https://pan.baidu.com/s/1xi-QLq_I75kha439EGqELw提取碼:kxde
【BAT必備】javaweb面試題:
鏈接:https://pan.baidu.com/s/1r3Bupn9qhJbw5ebR_6h94A提取碼:qba4
【BAT必備】Java基礎(chǔ)面試題:
鏈接:https://pan.baidu.com/s/1J40nYKIoV_VMCumoRpIyhQ提取碼:5xo7
【BAT必備】dubbo面試題:
鏈接:https://pan.baidu.com/s/10flnh7Tb0Oxd3yZPQOnjsA提取碼:5gc9
【BAT必備】activeMQ面試題:
鏈接:https://pan.baidu.com/s/1igNB64dpMCjCQkRzvqCXpQ提取碼:006a
【BAT必備】分布式相關(guān)面試題大全面試題:
鏈接:https://pan.baidu.com/s/1ZcpJDh07B2NPAL4_4VC6jQ提取碼:w4mw
【BAT必備】java面試題大全:
鏈接:https://pan.baidu.com/s/11jw0Ua4CZiI8-S6EadM_iQ提取碼:epmp
【BAT必備】Java面試匯總
鏈接:https://pan.baidu.com/s/1vG9_cNoiYBW5TY32S4wGnQ提取碼:k087
【BAT必備】2020年多家公司整理的350道Java面試題手冊(cè)
鏈接:https://pan.baidu.com/s/1FEGQVTgiyKG0kCasYn-n2g提取碼:f7y1
【BAT必備】Java全部核心知識(shí)點(diǎn)整理
鏈接:https://pan.baidu.com/s/1StG-ib70TDAE1Hb4NVLQRQ提取碼:5rp1
整理這些非常辛苦,大家點(diǎn)個(gè)贊在走吧hashmap和hashtable有什么區(qū)別
HashMap和Hashtable都是用來(lái)存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),但它們有以下區(qū)別:
1.線程安全性:Hashtable是線程安全的,所有的操作都是同步的。而HashMap不是線程安全的,需要自己實(shí)現(xiàn)同步措施。
2.空值:Hashtable不允許null作為key和value,否則會(huì)拋出NullPointerException異常。而HashMap允許null作為key和value。
3.初始容量和擴(kuò)容機(jī)制:Hashtable的初始容量為11,而HashMap的初始容量為16。Hashtable默認(rèn)的負(fù)載因子為0.75,而HashMap的默認(rèn)負(fù)載因子為0.75。當(dāng)Hashtable的大小達(dá)到一定閾值時(shí),會(huì)自動(dòng)進(jìn)行擴(kuò)容操作,而HashMap在元素?cái)?shù)量達(dá)到容量的75%時(shí)會(huì)擴(kuò)容。
4.性能:由于Hashtable是線程安全的,所以在多線程環(huán)境下性能較差。而HashMap在單線程環(huán)境下性能較好,在多線程環(huán)境下需要考慮同步措施,否則可能會(huì)造成數(shù)據(jù)不一致等問(wèn)題。
綜上所述,HashMap和Hashtable的主要區(qū)別在于線程安全性、空值、初始容量和擴(kuò)容機(jī)制、性能等方面。在選擇使用哪個(gè)類(lèi)時(shí),需要根據(jù)具體情況進(jìn)行考慮。
arraylist和hsahset的區(qū)別,hashmap和hashtable的區(qū)別
在Java2以前,一般使用Hashtable來(lái)映射鍵值和元素。為了使用Java集合框架,Java對(duì)Hashtable進(jìn)行了重新設(shè)計(jì),但是,為了向后兼容保留了所有的方法。Hashtable實(shí)現(xiàn)了Map接口,除了Hashtable具有同步功能之外,它與HashMap的用法是一樣的?!ぴ谑褂脮r(shí)一般是用ArrayList代替Vector,LinkedList代替Stack,HashMap代替HashTable,即使在多線程中需要同步,也是用同步包裝類(lèi)。另外在使用上還有一些小的差異,比如:
HashTable的key和value都不允許為null值,而HashMap的key和value則都是允許null值的。這個(gè)其實(shí)沒(méi)有好壞之分,只是Sun為了統(tǒng)一Collection的操作特性而改進(jìn)的。
HashTable有一個(gè)contains(Objectvalue)方法,功能上與containsValue(Objectvalue)一樣,但是在實(shí)現(xiàn)上花銷(xiāo)更大,現(xiàn)在已不推薦使用。而HashMap只有containsValue(Objectvalue)方法。
HashTable使用Enumeration,HashMap使用Iterator。Iterator其實(shí)與Enmeration功能上很相似,只是多了刪除的功能。用Iterator不過(guò)是在名字上變得更為貼切一些。模式的另外一個(gè)很重要的功用,就是能夠形成一種交流的語(yǔ)言(或者說(shuō)文化)。有時(shí)候,你說(shuō)Enumeration大家都不明白,說(shuō)Iterator就都明白了。
在實(shí)現(xiàn)上兩者已有一些差異,這里簡(jiǎn)單說(shuō)明一下:HashTable中構(gòu)造hash數(shù)組時(shí)initialCapacity默認(rèn)大小是11,增加的方式是old*2+1。HashMap中構(gòu)造hash數(shù)組時(shí)initialCapacity默認(rèn)大小是16,而且一定是2的指數(shù)。對(duì)于哈希值的使用也有所不同,HashTable直接使用對(duì)象的hashCode,代碼是這樣的:而HashMap重新計(jì)算hash值,而且用與代替求模:hashmap如何保證輸出順序
HashMap基于哈希表的Map接口的實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用null值和null鍵。(除了非同步和允許使用null之外,HashMap類(lèi)與Hashtable大致相同。)此類(lèi)不保證映射的順序,特別是它不保證該順序恒久不變。
Map和Collection的區(qū)別
Map和Collection都是Java中常用的數(shù)據(jù)結(jié)構(gòu)。它們的主要區(qū)別如下:
1.對(duì)象的存儲(chǔ)方式不同
Map是一種鍵值對(duì)映射的數(shù)據(jù)結(jié)構(gòu),存儲(chǔ)的是一組鍵值對(duì),每個(gè)鍵都對(duì)應(yīng)唯一的值。
Collection是一種存儲(chǔ)對(duì)象的數(shù)據(jù)結(jié)構(gòu),存儲(chǔ)的是一組對(duì)象,沒(méi)有鍵值對(duì)的概念。
2.常見(jiàn)實(shí)現(xiàn)方式不同
Map的常見(jiàn)實(shí)現(xiàn)方式有HashMap、TreeMap、LinkedHashMap等,它們?cè)趦?nèi)部實(shí)現(xiàn)上都不同,但在外部API上都提供了相同的操作方法。
Collection的常見(jiàn)實(shí)現(xiàn)方式有ArrayList、LinkedList、HashSet、TreeSet等,不同的實(shí)現(xiàn)方式在內(nèi)部實(shí)現(xiàn)和外部行為上都有所不同。
3.遍歷方式不同
Map的遍歷通常采用迭代器或者鍵值對(duì)的方式,例如foreach、keySet()、values()方法等。
Collection的遍歷則通常使用迭代器或者foreach方式,例如Iterator、ListIterator、foreach等。
4.存放元素的方式不同
Map存放的元素是鍵值對(duì),需要同時(shí)提供鍵和值,而Collection只需要提供元素即可。
5.替換元素的方式不同
Map的替換元素一般采用put()方法,即將已有鍵的值更新為新值。
Collection則常常采用set()方法來(lái)替換元素,例如List集合中的set(intindex,Objectelement)方法。
綜上所述,Map和Collection雖然都是常用的Java數(shù)據(jù)結(jié)構(gòu),但它們?cè)诖鎯?chǔ)方式、常見(jiàn)實(shí)現(xiàn)、遍歷方式、存放元素的方式和替換元素的方式等方面都有不同。開(kāi)發(fā)者應(yīng)根據(jù)具體需求選擇恰當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)來(lái)提高程序效率。
好了,關(guān)于hashmap和hashtable和java的hashmap和hashtable的問(wèn)題到這里結(jié)束啦,希望可以解決您的問(wèn)題哈!
本文鏈接:http:///kaifa/2573.html