<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試:如何決定使用 HashMap 還是 TreeMap?

          共 3504字,需瀏覽 8分鐘

           ·

          2020-07-28 12:23


          點(diǎn)擊上方“碼農(nóng)突圍”,馬上關(guān)注
          這里是碼農(nóng)充電第一站,回復(fù)“666”,獲取一份專屬大禮包
          真愛,請設(shè)置“星標(biāo)”或點(diǎn)個“在看”

          問:如何決定使用 HashMap 還是 TreeMap?
          介紹
          TreeMap的Key值是要求實(shí)現(xiàn)java.lang.Comparable,所以迭代的時候TreeMap默認(rèn)是按照Key值升序排序的;TreeMap的實(shí)現(xiàn)是基于紅黑樹結(jié)構(gòu)。適用于按自然順序或自定義順序遍歷鍵(key)。
          HashMap的Key值實(shí)現(xiàn)散列hashCode(),分布是散列的、均勻的,不支持排序;數(shù)據(jù)結(jié)構(gòu)主要是桶(數(shù)組),鏈表或紅黑樹。適用于在Map中插入、刪除和定位元素。
          結(jié)論
          如果你需要得到一個有序的結(jié)果時就應(yīng)該使用TreeMap(因?yàn)镠ashMap中元素的排列順序是不固定的)。除此之外,由于HashMap有更好的性能,所以大多不需要排序的時候我們會使用HashMap。
          拓展
          1、HashMap 和 TreeMap 的實(shí)現(xiàn)
          HashMap:?基于哈希表實(shí)現(xiàn)。使用HashMap要求添加的鍵類明確定義了hashCode()equals()[可以重寫hashCode()equals()],為了優(yōu)化HashMap空間的使用,您可以調(diào)優(yōu)初始容量和負(fù)載因子。
          • HashMap(): 構(gòu)建一個空的哈希映像
          • HashMap(Map m): 構(gòu)建一個哈希映像,并且添加映像m的所有映射
          • HashMap(int initialCapacity): 構(gòu)建一個擁有特定容量的空的哈希映像
          • HashMap(int initialCapacity, float loadFactor): 構(gòu)建一個擁有特定容量和加載因子的空的哈希映像
          TreeMap:?基于紅黑樹實(shí)現(xiàn)。TreeMap沒有調(diào)優(yōu)選項,因?yàn)樵摌淇偺幱谄胶鉅顟B(tài)。
          • TreeMap():構(gòu)建一個空的映像樹
          • TreeMap(Map m): 構(gòu)建一個映像樹,并且添加映像m中所有元素
          • TreeMap(Comparator c): 構(gòu)建一個映像樹,并且使用特定的比較器對關(guān)鍵字進(jìn)行排序
          • TreeMap(SortedMap s): 構(gòu)建一個映像樹,添加映像樹s中所有映射,并且使用與有序映像s相同的比較器排序
          2、HashMap 和 TreeMap 都是非線程安全
          HashMap繼承AbstractMap抽象類,TreeMap繼承自SortedMap接口。
          AbstractMap抽象類:?覆蓋了equals()和hashCode()方法以確保兩個相等映射返回相同的哈希碼。如果兩個映射大小相等、包含同樣的鍵且每個鍵在這兩個映射中對應(yīng)的值都相同,則這兩個映射相等。映射的哈希碼是映射元素哈希碼的總和,其中每個元素是Map.Entry接口的一個實(shí)現(xiàn)。因此,不論映射內(nèi)部順序如何,兩個相等映射會報告相同的哈希碼。
          SortedMap接口:?它用來保持鍵的有序順序。SortedMap接口為映像的視圖(子集),包括兩個端點(diǎn)提供了訪問方法。除了排序是作用于映射的鍵以外,處理SortedMap和處理SortedSet一樣。添加到SortedMap實(shí)現(xiàn)類的元素必須實(shí)現(xiàn)Comparable接口,否則您必須給它的構(gòu)造函數(shù)提供一個Comparator接口的實(shí)現(xiàn)。TreeMap類是它的唯一一個實(shí)現(xiàn)。
          3、TreeMap中默認(rèn)是按照升序進(jìn)行排序的,如何讓他降序
          通過自定義的比較器來實(shí)現(xiàn)
          定義一個比較器類,實(shí)現(xiàn)Comparator接口,重寫compare方法,有兩個參數(shù),這兩個參數(shù)通過調(diào)用compareTo進(jìn)行比較,而compareTo默認(rèn)規(guī)則是:
          • 如果參數(shù)字符串等于此字符串,則返回 0 值;
          • 如果此字符串小于字符串參數(shù),則返回一個小于 0 的值;
          • 如果此字符串大于字符串參數(shù),則返回一個大于 0 的值。
          自定義比較器時,在返回時多添加了個負(fù)號,就將比較的結(jié)果以相反的形式返回,代碼如下:
          static?class?MyComparator?implements?Comparator{
          ????@Override
          ????public?int?compare(Object?o1,?Object?o2)?{
          ????????//?TODO?Auto-generated?method?stub
          ????????String?param1?=?(String)o1;
          ????????String?param2?=?(String)o2;
          ????????return?-param1.compareTo(param2);
          ????}
          }
          之后,通過MyComparator類初始化一個比較器實(shí)例,將其作為參數(shù)傳進(jìn)TreeMap的構(gòu)造方法中:
          MyComparator?comparator?=?new?MyComparator();

          Map?map?=?new?TreeMap(comparator);
          這樣,我們就可以使用自定義的比較器實(shí)現(xiàn)降序了
          public?class?MapTest?{

          ????public?static?void?main(String[]?args)?{
          ????????//初始化自定義比較器
          ????????MyComparator?comparator?=?new?MyComparator();
          ????????//初始化一個map集合
          ????????Map?map?=?new?TreeMap(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");
          ????????//遍歷輸出
          ????????Iterator?iterator?=?map.keySet().iterator();
          ????????while(iterator.hasNext()){
          ????????????String?key?=?(String)iterator.next();
          ????????????System.out.println(map.get(key));
          ????????}
          ????}

          ????static?class?MyComparator?implements?Comparator{

          ????????@Override
          ????????public?int?compare(Object?o1,?Object?o2)?{
          ????????????//?TODO?Auto-generated?method?stub
          ????????????String?param1?=?(String)o1;
          ????????????String?param2?=?(String)o2;
          ????????????return?-param1.compareTo(param2);
          ????????}

          ????}

          }

          END


          ---END---
          重磅!碼農(nóng)突圍-技術(shù)交流群已成立

          掃碼可添加碼農(nóng)突圍助手,可申請加入碼農(nóng)突圍大群和細(xì)分方向群,細(xì)分方向已涵蓋:Java、Python、機(jī)器學(xué)習(xí)、大數(shù)據(jù)、人工智能等群。
          一定要備注:開發(fā)方向+地點(diǎn)+學(xué)校/公司+昵稱(如Java開發(fā)+上海+拼夕夕+猴子),根據(jù)格式備注,可更快被通過且邀請進(jìn)群

          ▲長按加群

          推薦閱讀

          ? GitHub宣布已將所有代碼永久封存于北極地底1000年!網(wǎng)友炸鍋了:我寫的bug終于能流傳永世了!
          ?? 優(yōu)秀!94年出生的她,受聘為深圳大學(xué)正教授!
          ???使用 IDEA 幾分鐘就重構(gòu)了同事800 行"又臭又長" 的類!真香!
          ???雷軍1994年寫的老代碼曝光,被稱像詩一樣優(yōu)雅
          ?? 推薦 33 個 IDEA 最牛配置,好用到飛起來!
          ?? 同事:你居然還在用 try catch 處理異常?有點(diǎn)Low啊
          最近面試BAT,整理一份面試資料Java面試BAT通關(guān)手冊,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
          獲取方式:點(diǎn)“在看”,關(guān)注公眾號并回復(fù)?BAT?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
          如有收獲,點(diǎn)個在看,誠摯感謝明天見(??ω??)??

          瀏覽 24
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美三级精品网站 | 日本在线视频一区二区三区三区 | 麻豆精品国产 | 苍井空无码视频在线观看 | 色先锋AV |