問(wèn):怎么決定運(yùn)用HashMap還是TreeMap?
介紹
TreeMap的Key值是要求完成java.lang.Comparable,所以迭代的時(shí)分TreeMap默許是依照Key值升序排序的;TreeMap的完成是根據(jù)紅黑樹(shù)結(jié)構(gòu)。適用于按自然次序或自界說(shuō)次序遍歷鍵(key)。
HashMap的Key值完成散列hashCode(),分布是散列的、均勻的,不支持排序;數(shù)據(jù)結(jié)構(gòu)主要是桶(數(shù)組),鏈表或紅黑樹(shù)。適用于在Map中插入、刪除和定位元素。
結(jié)論
假如你需要得到一個(gè)有序的成果時(shí)就應(yīng)該運(yùn)用TreeMap(因?yàn)镠ashMap中元素的擺放次序是不固定的)。除此之外,由于HashMap有更好的功能,所以大多不需要排序的時(shí)分咱們會(huì)運(yùn)用HashMap。
拓展
1、HashMap和TreeMap的完成
HashMap:根據(jù)哈希表完成。運(yùn)用HashMap要求增加的鍵類明確界說(shuō)了hashCode()和equals()[能夠重寫(xiě)hashCode()和equals()],為了優(yōu)化HashMap空間的運(yùn)用,您能夠調(diào)優(yōu)初始容量和負(fù)載因子。
HashMap():構(gòu)建一個(gè)空的哈希映像
HashMap(Mapm):構(gòu)建一個(gè)哈希映像,而且增加映像m的所有映射
HashMap(intinitialCapacity):構(gòu)建一個(gè)具有特定容量的空的哈希映像
HashMap(intinitialCapacity,floatloadFactor):構(gòu)建一個(gè)具有特定容量和加載因子的空的哈希映像
TreeMap:根據(jù)紅黑樹(shù)完成。TreeMap沒(méi)有調(diào)優(yōu)選項(xiàng),因?yàn)樵摌?shù)總處于平衡狀況。
TreeMap():構(gòu)建一個(gè)空的映像樹(shù)
TreeMap(Mapm):構(gòu)建一個(gè)映像樹(shù),而且增加映像m中所有元素
TreeMap(Comparatorc):構(gòu)建一個(gè)映像樹(shù),而且運(yùn)用特定的比較器對(duì)關(guān)鍵字進(jìn)行排序
TreeMap(SortedMaps):構(gòu)建一個(gè)映像樹(shù),增加映像樹(shù)s中所有映射,而且運(yùn)用與有序映像s相同的比較器排序
2、HashMap和TreeMap都對(duì)錯(cuò)線程安全
HashMap承繼AbstractMap抽象類,TreeMap承繼自SortedMap接口。
AbstractMap抽象類:覆蓋了equals()和hashCode()辦法以保證兩個(gè)持平映射回來(lái)相同的哈希碼。假如兩個(gè)映射巨細(xì)持平、包含相同的鍵且每個(gè)鍵在這兩個(gè)映射中對(duì)應(yīng)的值都相同,則這兩個(gè)映射持平。映射的哈希碼是映射元素哈希碼的總和,其間每個(gè)元素是Map.Entry接口的一個(gè)完成。因此,不論映射內(nèi)部次序怎么,兩個(gè)持平映射會(huì)陳述相同的哈希碼。
SortedMap接口:它用來(lái)保持鍵的有序次序。SortedMap接口為映像的視圖(子集),包含兩個(gè)端點(diǎn)供給了訪問(wèn)辦法。除了排序是作用于映射的鍵以外,處理SortedMap和處理SortedSet相同。增加到SortedMap完成類的元素必須完成Comparable接口,不然您必須給它的結(jié)構(gòu)函數(shù)供給一個(gè)Comparator接口的完成。TreeMap類是它的僅有一個(gè)完成。
3、TreeMap中默許是依照升序進(jìn)行排序的,怎么讓他降序
經(jīng)過(guò)自界說(shuō)的比較器來(lái)完成
界說(shuō)一個(gè)比較器類,完成Comparator接口,重寫(xiě)compare辦法,有兩個(gè)參數(shù),這兩個(gè)參數(shù)經(jīng)過(guò)調(diào)用compareTo進(jìn)行比較,而compareTo默許規(guī)則是:
假如參數(shù)字符串等于此字符串,則回來(lái)0值;
假如此字符串小于字符串參數(shù),則回來(lái)一個(gè)小于0的值;
假如此字符串大于字符串參數(shù),則回來(lái)一個(gè)大于0的值。
自界說(shuō)比較器時(shí),在回來(lái)時(shí)多增加了個(gè)負(fù)號(hào),就將比較的成果以相反的形式回來(lái),代碼如下:
staticclassMyComparatorimplementsComparator{
@Overridepublicintcompare(Objecto1,Objecto2){//TODOAuto-generatedmethodstubStringparam1=(String)o1;
Stringparam2=(String)o2;return-param1.compareTo(param2);
}
}
之后,經(jīng)過(guò)MyComparator類初始化一個(gè)比較器實(shí)例,將其作為參數(shù)傳進(jìn)TreeMap的結(jié)構(gòu)辦法中:
MyComparatorcomparator=newMyComparator();
Mapmap=newTreeMap(comparator);
這樣,咱們就能夠運(yùn)用自界說(shuō)的比較器完成降序了
publicclassMapTest{publicstaticvoidmain(String[]args){//初始化自界說(shuō)比較器MyComparatorcomparator=newMyComparator();//初始化一個(gè)map調(diào)集Mapmap=newTreeMap(comparator);//存入數(shù)據(jù)map.put(“a”,”a”);
map.put(“b”,”b”);
map.put(“f”,”f”);
map.put(“d”,”d”);
map.put(“c”,”c”);
map.put(“g”,”g”);//遍歷輸出Iteratoriterator=map.keySet().iterator();while(iterator.hasNext()){
Stringkey=(String)iterator.next();
System.out.println(map.get(key));
}
}staticclassMyComparatorimplementsComparator{
@Overridepublicintcompare(Objecto1,Objecto2){//TODOAuto-generatedmethodstubStringparam1=(String)o1;
Stringparam2=(String)o2;return-param1.compareTo(param2);
}
}
}
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹(shù)莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長(zhǎng)沙市天心區(qū)芙蓉中路三段398號(hào)新時(shí)空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運(yùn)營(yíng)網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號(hào)