這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Java中HashMap和TreeMap有什么區(qū)別,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括臥龍網(wǎng)站建設(shè)、臥龍網(wǎng)站制作、臥龍網(wǎng)頁(yè)制作以及臥龍網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,臥龍網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到臥龍省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
首先介紹一下什么是Map。在數(shù)組中我們是通過(guò)數(shù)組下標(biāo)來(lái)對(duì)其內(nèi)容索引的,而在Map中我們通過(guò)對(duì)象來(lái)對(duì)對(duì)象進(jìn)行索引,用來(lái)索引的對(duì)象叫做key,其對(duì)應(yīng)的對(duì)象叫做value。這就是我們平時(shí)說(shuō)的鍵值對(duì)。
HashMap通過(guò)hashcode對(duì)其內(nèi)容進(jìn)行快速查找,而 TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個(gè)有序的結(jié)果你就應(yīng)該使用TreeMap(HashMap中元素的排列順序是不固定的)。
HashMap 非線程安全 TreeMap 非線程安全
線程安全
在Java里,線程安全一般體現(xiàn)在兩個(gè)方面:
1、多個(gè)thread對(duì)同一個(gè)java實(shí)例的訪問(wèn)(read和modify)不會(huì)相互干擾,它主要體現(xiàn)在關(guān)鍵字synchronized。如ArrayList和Vector,HashMap和Hashtable
(后者每個(gè)方法前都有synchronized關(guān)鍵字)。如果你在interator一個(gè)List對(duì)象時(shí),其它線程remove一個(gè)element,問(wèn)題就出現(xiàn)了。
2、每個(gè)線程都有自己的字段,而不會(huì)在多個(gè)線程之間共享。它主要體現(xiàn)在java.lang.ThreadLocal類,而沒(méi)有Java關(guān)鍵字支持,如像static、transient那樣。
1.AbstractMap抽象類和SortedMap接口
AbstractMap抽象類:(HashMap繼承AbstractMap)覆蓋了equals()和hashCode()方法以確保兩個(gè)相等映射返回相同的哈希碼。如果兩個(gè)映射大小相等、包含同樣的鍵且每個(gè)鍵在這兩個(gè)映射中對(duì)應(yīng)的值都相同,則這兩個(gè)映射相等。映射的哈希碼是映射元素哈希碼的總和,其中每個(gè)元素是Map.Entry接口的一個(gè)實(shí)現(xiàn)。因此,不論映射內(nèi)部順序如何,兩個(gè)相等映射會(huì)報(bào)告相同的哈希碼。
SortedMap接口:(TreeMap繼承自SortedMap)它用來(lái)保持鍵的有序順序。SortedMap接口為映像的視圖(子集),包括兩個(gè)端點(diǎn)提供了訪問(wèn)方法。除了排序是作用于映射的鍵以外,處理SortedMap和處理SortedSet一樣。添加到SortedMap實(shí)現(xiàn)類的元素必須實(shí)現(xiàn)Comparable接口,否則您必須給它的構(gòu)造函數(shù)提供一個(gè)Comparator接口的實(shí)現(xiàn)。TreeMap類是它的唯一一份實(shí)現(xiàn)。
2.兩種常規(guī)Map實(shí)現(xiàn)
HashMap:基于哈希表實(shí)現(xiàn)。使用HashMap要求添加的鍵類明確定義了hashCode()和equals()[可以重寫(xiě)hashCode()和equals()],為了優(yōu)化HashMap空間的使用,您可以調(diào)優(yōu)初始容量和負(fù)載因子。
(1)HashMap(): 構(gòu)建一個(gè)空的哈希映像
(2)HashMap(Map m): 構(gòu)建一個(gè)哈希映像,并且添加映像m的所有映射
(3)HashMap(int initialCapacity): 構(gòu)建一個(gè)擁有特定容量的空的哈希映像
(4)HashMap(int initialCapacity, float loadFactor): 構(gòu)建一個(gè)擁有特定容量和加載因子的空的哈希映像
TreeMap:基于紅黑樹(shù)實(shí)現(xiàn)。TreeMap沒(méi)有調(diào)優(yōu)選項(xiàng),因?yàn)樵摌?shù)總處于平衡狀態(tài)。
(1)TreeMap():構(gòu)建一個(gè)空的映像樹(shù)
(2)TreeMap(Map m): 構(gòu)建一個(gè)映像樹(shù),并且添加映像m中所有元素
(3)TreeMap(Comparator c): 構(gòu)建一個(gè)映像樹(shù),并且使用特定的比較器對(duì)關(guān)鍵字進(jìn)行排序
(4)TreeMap(SortedMap s): 構(gòu)建一個(gè)映像樹(shù),添加映像樹(shù)s中所有映射,并且使用與有序映像s相同的比較器排序
3.兩種常規(guī)Map性能
HashMap:適用于在Map中插入、刪除和定位元素。
Treemap:適用于按自然順序或自定義順序遍歷鍵(key)。
4.總結(jié)
HashMap通常比TreeMap快一點(diǎn)(樹(shù)和哈希表的數(shù)據(jù)結(jié)構(gòu)使然),建議多使用HashMap,在需要排序的Map時(shí)候才用TreeMap。
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class HashMaps {
public static void main(String[] args) {
Map
map.put("a", "aaa");
map.put("b", "bbb");
map.put("c", "ccc");
map.put("d", "ddd");
Iterator
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println("map.get(key) is :" + map.get(key));
}
// 定義HashTable,用來(lái)測(cè)試
Hashtable
tab.put("a", "aaa");
tab.put("b", "bbb");
tab.put("c", "ccc");
tab.put("d", "ddd");
Iterator
while (iterator_1.hasNext()) {
Object key = iterator_1.next();
System.out.println("tab.get(key) is :" + tab.get(key));
}
TreeMap
tmp.put("a", "aaa");
tmp.put("b", "bbb");
tmp.put("c", "ccc");
tmp.put("d", "cdc");
Iterator
while (iterator_2.hasNext()) {
Object key = iterator_2.next();
System.out.println("tmp.get(key) is :" + tmp.get(key));
}
}
}
運(yùn)行結(jié)果如下:
map.get(key) is :ddd
map.get(key) is :bbb
map.get(key) is :ccc
map.get(key) is :aaa
tab.get(key) is :bbb
tab.get(key) is :aaa
tab.get(key) is :ddd
tab.get(key) is :ccc
tmp.get(key) is :aaa
tmp.get(key) is :bbb
tmp.get(key) is :ccc
tmp.get(key) is :cdc武漢仁濟(jì)中西醫(yī)結(jié)合醫(yī)院
HashMap的結(jié)果是沒(méi)有排序的,而TreeMap輸出的結(jié)果是排好序的。
下面就要進(jìn)入本文的主題了。先舉個(gè)例子說(shuō)明一下怎樣使用HashMap:
import java.util.*;
public class Exp1 {
public static void main(String[] args){
HashMap h2=new HashMap();
Random r1=new Random();
for (int i=0;i<1000;i++){
Integer t=new Integer(r1.nextInt(20));
if (h2.containsKey(t))
((Ctime)h2.get(t))。count++;
else
h2.put(t, new Ctime());
}
System.out.println(h2);
}
}
class Ctime{
int count=1;
public String toString(){
return Integer.toString(count);
}
}
上述就是小編為大家分享的Java中HashMap和TreeMap有什么區(qū)別了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。