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