摘要:的函數(shù)都是同步的,這意味著它是線程安全的。直接使用對(duì)象的。是的輕量級(jí)實(shí)現(xiàn)非線程安全的實(shí)現(xiàn)都完成了接口,主要區(qū)別在于能否鍵對(duì)值能為。同時(shí)其內(nèi)部方法有區(qū)別中將的方法去掉了,改為和避免混淆。支持的遍歷種類不同只支持迭代器遍歷。
java在數(shù)據(jù)結(jié)構(gòu)中的映射定義了一個(gè)接口java.util.Map。
Map包含三個(gè)實(shí)現(xiàn)類HashMap、Hashtable、TreeMap。Map是用來(lái)存儲(chǔ)鍵對(duì)值
(索引為對(duì)象key K,值為對(duì)象value V)的數(shù)據(jù)結(jié)構(gòu)。
首先我們得明確其基本狀況再進(jìn)行比較。
HashMap:
(1)由數(shù)組+鏈表組成的,基于哈希表的Map實(shí)現(xiàn),數(shù)組是HashMap的主體,
鏈表則是主要為了解決哈希沖突而存在的。
(2)不是線程安全的,HashMap可以接受為null的鍵(key)和值(value)。
(3)HashMap重新計(jì)算hash值
Hashtable:
(1)Hashtable 是一個(gè)散列表,它存儲(chǔ)的內(nèi)容是鍵值對(duì)(key-value)映射。
(2)Hashtable 的函數(shù)都是同步的,這意味著它是線程安全的。它的key、value都不可以為null。
(3)HashTable直接使用對(duì)象的hashCode。
HashMap是Hashtable的輕量級(jí)實(shí)現(xiàn)(非線程安全的實(shí)現(xiàn))都完成了Map接口,主要區(qū)別在于能否鍵對(duì)值
同時(shí)其內(nèi)部方法有區(qū)別:HashMap中將Hashtable的contains方法去掉了,改為containsvalue和containsKey,避免混淆。Hashtable繼承于Dictionary類,而HashMap是java 1.2 引進(jìn)的Map接口一個(gè)實(shí)現(xiàn)。HashMap就效率而言高于Hashtable。
TreeMap則是基于紅黑樹的一種提供順序訪問的Map,它的get、put、remove之類的操作都是o(logn)的時(shí)間復(fù)雜度,具體順序可以由指定的Comparator來(lái)決定,或者根據(jù)鍵的自然順序來(lái)判斷
區(qū)別:
1 繼承和實(shí)現(xiàn)方式不同
HashMap 繼承于AbstractMap,實(shí)現(xiàn)了Map、Cloneable、java.io.Serializable接口。
Hashtable 繼承于Dictionary,實(shí)現(xiàn)了Map、Cloneable、java.io.Serializable接口。
2 線程安全不同
Hashtable的幾乎所有函數(shù)都是同步的,即它是線程安全的,支持多線程。
而HashMap的函數(shù)則是非同步的,它不是線程安全的。
3 對(duì)null值的處理不同
HashMap的key、value都可以為null。
Hashtable的key、value都不可以為null。
4 支持的遍歷種類不同
HashMap只支持Iterator(迭代器)遍歷。
而Hashtable支持Iterator(迭代器)和Enumeration(枚舉器)兩種方式遍歷
5 通過Iterator迭代器遍歷時(shí),遍歷的順序不同
HashMap是“從前向后”的遍歷數(shù)組;再對(duì)數(shù)組具體某一項(xiàng)對(duì)應(yīng)的鏈表,從表頭開始進(jìn)行遍歷。
Hashtabl是“從后往前”的遍歷數(shù)組;再對(duì)數(shù)組具體某一項(xiàng)對(duì)應(yīng)的鏈表,從表頭開始進(jìn)行遍歷。
6 容量的初始值 和 增加方式都不一樣
HashMap默認(rèn)的容量大小是16;增加容量時(shí),每次將容量變?yōu)椤霸既萘縳2”。
Hashtable默認(rèn)的容量大小是11;增加容量時(shí),每次將容量變?yōu)椤霸既萘縳2 + 1”。
7 添加key-value時(shí)的hash值算法不同
HashMap添加元素時(shí),是使用自定義的哈希算法。
Hashtable沒有自定義哈希算法,而直接采用的key的hashCode()。
8 部分API不同
Hashtable支持contains(Object value)方法,而且重寫了toString()方法;
而HashMap不支持contains(Object value)方法,沒有重寫toString()方法。
最后如何實(shí)現(xiàn)HashMap的同步,有兩種方法,一是:可以通過靜態(tài)方法
Map m =Collections.synchronizedMap(new HashMap())來(lái)打到同步的效果
二是:接使用JDK 5.0之后提供的java.util.concurrent包里的ConcurrentHashMap類。
表格比較如下:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/75725.html
摘要:線程安全是線程安全的,不是線程安全的。是添加的,貌似沒人用過這個(gè),棧長(zhǎng)我也沒用過。。最后一點(diǎn)有幾個(gè)人知道知道的給棧長(zhǎng)點(diǎn)個(gè)贊回應(yīng)一下,不知道的有收獲的也點(diǎn)一個(gè)贊支持一下吧。 HashMap 和 Hashtable 是 Java 開發(fā)程序員必須要掌握的,也是在各種 Java 面試場(chǎng)合中必須會(huì)問到的。 但你對(duì)這兩者的區(qū)別了解有多少呢? 現(xiàn)在,棧長(zhǎng)我給大家總結(jié)一下,或許有你不明朗的地方,在棧長(zhǎng)...
摘要:若遇到哈希沖突,則將沖突的值加到鏈表中即可。之后相比于之前的版本,之后在解決哈希沖突時(shí)有了較大的變化,當(dāng)鏈表長(zhǎng)度大于閾值默認(rèn)為時(shí),將鏈表轉(zhuǎn)化為紅黑樹,以減少搜索時(shí)間。有序,唯一紅黑樹自平衡的排序二叉樹。 本文是最最最常見Java面試題總結(jié)系列第三周的文章。主要內(nèi)容: Arraylist 與 LinkedList 異同 ArrayList 與 Vector 區(qū)別 HashMap的底層...
摘要:把內(nèi)存分成兩種,一種叫做棧內(nèi)存,一種叫做堆內(nèi)存在函數(shù)中定義的一些基本類型的變量和對(duì)象的引用變量都是在函數(shù)的棧內(nèi)存中分配。堆內(nèi)存用于存放由創(chuàng)建的對(duì)象和數(shù)組。 一次慘痛的阿里技術(shù)面 就在昨天,有幸接到了阿里的面試通知,本來(lái)我以為自己的簡(jiǎn)歷應(yīng)該不會(huì)的到面試的機(jī)會(huì)了,然而機(jī)會(huì)卻這么來(lái)了,我卻沒有做好準(zhǔn)備,被面試官大大一通血虐。因此,我想寫點(diǎn)東西紀(jì)念一下這次的經(jīng)歷,也當(dāng)一次教訓(xùn)了。其實(shí)面試官大大...
摘要:接口在類庫(kù)中有很多具體的實(shí)現(xiàn)。接口的意義是為各種具體的集合提供了最大化的統(tǒng)一操作方式。集合類框架的基本接口代表一組對(duì)象,每一個(gè)對(duì)象都是他的子元素不包含重復(fù)元素的有序的,可以包含重復(fù)元素將映射到的對(duì)象,不能重復(fù)。 寫在之前: 這篇文章是自己面試過程中,總結(jié)出來(lái)的關(guān)于Java集合類的總結(jié)。每次面試之前來(lái)出來(lái)看看,速度快,也能很迅速的回憶一些細(xì)節(jié)問題。發(fā)布這篇文章,不僅僅是希望大家臨陣磨槍,...
摘要:和的區(qū)別和的區(qū)別是,在操作的方法上加入關(guān)鍵字,使得線程安全。使用進(jìn)行比較,或者傳入的比較器。基于,它自己的任務(wù)主要是維護(hù)保持順序的雙向鏈表。和的區(qū)別提供了一個(gè)高效的線程安全的訪問和更新的方式。在中的過程和類似。 HashTable和HashMap的區(qū)別 HashTable和HashMap的區(qū)別是,HashTable在操作table的方法上加入synchronized關(guān)鍵字,使得線程安全...
閱讀 2520·2023-04-25 14:54
閱讀 595·2021-11-24 09:39
閱讀 1804·2021-10-26 09:51
閱讀 3846·2021-08-21 14:10
閱讀 3477·2021-08-19 11:13
閱讀 2692·2019-08-30 14:23
閱讀 1804·2019-08-29 16:28
閱讀 3349·2019-08-23 13:45