treemapjava
Ⅰ java中,map分為哪些種類
您好,提問者:
Map:HashMap、TreeMap、Hashtable。
1、HashMap:線程不安全,鍵、值不允許為null。
2、Hashtable:線程安全,鍵、值允許為null。
3、TreeMap:線程不安全、鍵、值不允許為null,底層二叉樹。
Ⅱ Java中HashMap和TreeMap的區別深入理解
HashMap底層是用數組做的,TreeMap是基於樹做的
這么做的結果就是HashMap的數據在不停的添加的時候效率會比較低,而對於查找的效率是比較快的,TreeMap對於添加的效率是比較高的但是對於查找的效率要相對比較低一些
這里簡單從底層說一下,我就不從具體的實現上說,只從數據結構和大致的原理上來補充一下我的答案。
HashMap這個類在存儲的時候,首先根據key來計算機將要存儲的key-value映射對存儲在數組的什麼位置上,當計算出位置後就把這個映射對存儲到這個位置上。當讀取的時候,首先根據key來計算出一個位置來,到數組的相應的位置上去讀取數據,如果沒有數據,則表示此Map中不存在該映射對,若存在則直接返回。說到這里就可以解釋一下為什麼對於不停地存儲的效率相對比較低了,首先在初始化的時候對於數組的長度給了一個初始的長度,當往這裡面添加數據達到一定的程度的時候就沒法繼續添加數據了,繼續添加數據的沖突就會增大,或者沒法添加數據(這里有一個衡量的量就是裝填因子,是指這個數組中的添加的數據的個數和數組長度的比值,在java中比較合理的裝填因子數是0.75),當數據添加到這個程度的時候不能不讓用戶繼續添加數據吧,總得解決繼續添加數據的問題啊,於是提出了解決方案,即開一個更大的數組,把當前上的每一個數據重新在更大的數組上計算位置,並把數據復制過去,這樣完成的數組的擴大,看完這個我們知道,這個過程是很耗時的,所以說對於不停的存儲數據時效率是比較低的。這里有沒有一個稍微好一點的解決方案或者說不需要進行數組的擴大嗎,我們能不能一開始在初始化的時候就把數組的空間開辟的足夠大,這樣就不用在存儲的過程進行復制了,可以嗎,答案是肯定的,java給我們提供了這個在初始化的時候的方式。但是,也是有問題的那就是我們的數據不夠多,就會造成空間的浪費。有沒有一個速度即快又不浪費空間的方式呢,解決方案也有一個,那就是在開始的時候我們就能很好的預測數據的規模,這樣我們在開始的時候按照相應的規模進行初始化,這樣就很好了,實際中我們是不能很好的預測這個規模的。於是對於這種情況提出了下一個解決方案TreeMap。
TreeMap是一個基於樹的存儲結構,學過數據結構的應該知道,樹的實現方式是基於指針實現的,在Java中是用引用模擬實現的,這里大家都知道,其實樹的讀取效率並不低,這里是相對於數組的順序查找來說的,但是與HashMap的查找方式相比就有了差距,HashMap是上來先問你在哪,直接就去取數據了,TreeMap需要遍歷,也就是需要挨個詢問你是我要的東西嗎,對比一下,是就返回,不是就繼續查找,於是查找的效率就低了,但是它解決了HashMap數組擴大的時候的效率問題,就是新添加的數據可以往裡面添加,不會出現復制的情況,這里就是由於模擬的指針的緣故實現的。
其實從總體來說這兩個各有利弊,我們在使用的時候需要根據實際的需要來選擇相應的類。
Ⅲ Java中HashMap和TreeMap的區別深入理解
HashMap通過hashcode對其內容進行快速查找,而 TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。
HashMap 非線程安全 TreeMap 非線程安全
線程安全
在Java里,線程安全一般體現在兩個方面:
1、多個thread對同一個java實例的訪問(read和modify)不會相互干擾,它主要體現在關鍵字synchronized。如ArrayList和Vector,HashMap和Hashtable
(後者每個方法前都有synchronized關鍵字)。如果你在interator一個List對象時,其它線程remove一個element,問題就出現了。
2、每個線程都有自己的欄位,而不會在多個線程之間共享。它主要體現在java.lang.ThreadLocal類,而沒有Java關鍵字支持,如像static、transient那樣。
1.AbstractMap抽象類和SortedMap介面
AbstractMap抽象類:(HashMap繼承AbstractMap)覆蓋了equals()和hashCode()方法以確保兩個相等映射返回相同的哈希碼。如果兩個映射大小相等、包含同樣的鍵且每個鍵在這兩個映射中對應的值都相同,則這兩個映射相等。映射的哈希碼是映射元素哈希碼的總和,其中每個元素是Map.Entry介面的一個實現。因此,不論映射內部順序如何,兩個相等映射會報告相同的哈希碼。
SortedMap介面:(TreeMap繼承自SortedMap)它用來保持鍵的有序順序。SortedMap介面為映像的視圖(子集),包括兩個端點提供了訪問方法。除了排序是作用於映射的鍵以外,處理SortedMap和處理SortedSet一樣。添加到SortedMap實現類的元素必須實現Comparable介面,否則您必須給它的構造函數提供一個Comparator介面的實現。TreeMap類是它的唯一一份實現。
2.兩種常規Map實現
HashMap:基於哈希表實現。使用HashMap要求添加的鍵類明確定義了hashCode()和equals()[可以重寫hashCode()和equals()],為了優化HashMap空間的使用,您可以調優初始容量和負載因子。
(1)HashMap(): 構建一個空的哈希映像
(2)HashMap(Map m): 構建一個哈希映像,並且添加映像m的所有映射
(3)HashMap(int initialCapacity): 構建一個擁有特定容量的空的哈希映像
(4)HashMap(int initialCapacity, float loadFactor): 構建一個擁有特定容量和載入因子的空的哈希映像
TreeMap:基於紅黑樹實現。TreeMap沒有調優選項,因為該樹總處於平衡狀態。
(1)TreeMap():構建一個空的映像樹
(2)TreeMap(Map m): 構建一個映像樹,並且添加映像m中所有元素
(3)TreeMap(Comparator c): 構建一個映像樹,並且使用特定的比較器對關鍵字進行排序
(4)TreeMap(SortedMap s): 構建一個映像樹,添加映像樹s中所有映射,並且使用與有序映像s相同的比較器排序
3.兩種常規Map性能
HashMap:適用於在Map中插入、刪除和定位元素。
Treemap:適用於按自然順序或自定義順序遍歷鍵(key)。
4.總結
HashMap通常比TreeMap快一點(樹和哈希表的數據結構使然),建議多使用HashMap,在需要排序的Map時候才用TreeMap。