java -Map總結(jié)(HashMap, Hashtable, TreeMap, WeakHashMap等使用場景)

Paste_Image.png

Map概括

  • Map 是“鍵值對”映射的抽象接口。
  • AbstractMap 實現(xiàn)了Map中的絕大部分函數(shù)接口。它減少了“Map的實現(xiàn)類”的重復編碼。
  • SortedMap 有序的“鍵值對”映射接口。
  • NavigableMap 是繼承于SortedMap的,支持導航函數(shù)的接口。
  • HashMap, Hashtable, TreeMap, WeakHashMap這4個類是“鍵值對”映射的實現(xiàn)類。它們各有區(qū)別!
  • HashMap 是基于“拉鏈法”實現(xiàn)的散列表。一般用于單線程程序中。 對HashMap的同步處理可以使用Collections類提供的synchronizedMap靜態(tài)方法,或者直接使用JDK 5.0之后提供的java.util.concurrent包里的ConcurrentHashMap類。
  • Hashtable 也是基于“拉鏈法”實現(xiàn)的散列表。它一般用于多線程程序中。
  • WeakHashMap 也是基于“拉鏈法”實現(xiàn)的散列表,它一般也用于單線程程序中。相比HashMap,WeakHashMap中的鍵是“弱鍵”,當“弱鍵”被GC回收時,它對應的鍵值對也會被從WeakHashMap中刪除;而HashMap中的鍵是強鍵。
  • TreeMap 是有序的散列表,它是通過紅黑樹實現(xiàn)的。它一般用于單線程中存儲有序的映射。

HashMap和Hashtable異同

HashMap和Hashtable的相同點

  • HashMap和Hashtable都是存儲“鍵值對(key-value)”的散列表,而且都是采用拉鏈法實現(xiàn)的。
  • 存儲的思想都是:通過table數(shù)組存儲,數(shù)組的每一個元素都是一個Entry;而一個Entry就是一個單向鏈表,Entry鏈表中的每一個節(jié)點就保存了key-value鍵值對數(shù)據(jù)。

HashMap和Hashtable的使用場景

最后再說說“HashMap和Hashtable”使用的情景。
其實,若了解它們之間的不同之處后,可以很容易的區(qū)分根據(jù)情況進行取舍。例如:

  • 若在單線程中,我們往往會選擇HashMap;而在多線程中,則會選擇Hashtable。
  • 若不能插入null元素,則選擇Hashtable;否則,可以選擇HashMap。
    但這個不是絕對的標準。例如,在多線程中,我們可以自己對HashMap進行同步,也可以選擇ConcurrentHashMap。當HashMap和Hashtable都不能滿足自己的需求時,還可以考慮新定義一個類,繼承或重新實現(xiàn)散列表;當然,一般情況下是不需要的了。

HashMap和WeakHashMap異同

HashMap和WeakHashMap的相同點

  • 它們都是散列表,存儲的是“鍵值對”映射。
  • 它們都繼承于AbstractMap,并且實現(xiàn)Map基礎(chǔ)。
  • 它們的構(gòu)造函數(shù)都一樣。它們都包括4個構(gòu)造函數(shù),而且函數(shù)的參數(shù)都一樣。
  • 默認的容量大小是16,默認的加載因子是0.75。
  • 它們的“鍵”和“值”都允許為null。
  • 它們都是“非同步的”。

HashMap和WeakHashMap的不同點

  • HashMap實現(xiàn)了Cloneable和Serializable接口,而WeakHashMap沒有。
  • HashMap實現(xiàn)Cloneable,意味著它能通過clone()克隆自己。
  • HashMap實現(xiàn)Serializable,意味著它支持序列化,能通過序列化去傳輸。
  • HashMap的“鍵”是“強引用(StrongReference)”,而WeakHashMap的鍵是“弱引用(WeakReference)”。WeakReference的“弱鍵”能實現(xiàn)WeakReference對“鍵值對”的動態(tài)回收。當“弱鍵”不再被使用到時,GC會回收它,WeakReference也會將“弱鍵”對應的鍵值對刪除。這個“弱鍵”實現(xiàn)的動態(tài)回收“鍵值對”的原理呢?其實,通過WeakReference(弱引用)和ReferenceQueue(引用隊列)實現(xiàn)的。 首先,我們需要了解WeakHashMap中:
  • 第一,“鍵”是WeakReference,即key是弱鍵。
  • 第二,ReferenceQueue是一個引用隊列,它是和WeakHashMap聯(lián)合使用的。當弱引用所引用的對象被垃圾回收,Java虛擬機就會把這個弱引用加入到與之關(guān)聯(lián)的引用隊列中。 WeakHashMap中的ReferenceQueue是queue。
  • 第三,WeakHashMap是通過數(shù)組實現(xiàn)的,我們假設這個數(shù)組是table。

本文來自:http://www.cnblogs.com/skywang12345/p/3311126.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Java SE 基礎(chǔ): 封裝、繼承、多態(tài) 封裝: 概念:就是把對象的屬性和操作(或服務)結(jié)合為一個獨立的整體,并盡...
    Jayden_Cao閱讀 2,252評論 0 8
  • Map 我們都知道 Map 是鍵值對關(guān)系的集合,并且鍵唯一,鍵一對一對應值。 關(guān)于 Map 的定義,大概就這些吧,...
    Anonymous___閱讀 697評論 0 1
  • 作為一個程序員,在找工作的過程中,都會遇到筆試,而很多筆試里面都包括java,尤其是作為一個Android開發(fā)工程...
    左神話閱讀 8,194評論 15 295
  • 能夠伴你走過半生的情誼,就如同積淀下的沙石,自有其份量。在這物欲橫流的社會里,最是真情難得。友情不知在何時也沾染了...
    漩渦旋閱讀 327評論 0 1
  • 根據(jù)前面3篇文章講的內(nèi)容,我們得到了核心任務的流程,接下來就是要把文字流程圖變成圖形界面了,這里才是畫原型的開始。...
    烤魚吃辣椒閱讀 573評論 0 5

友情鏈接更多精彩內(nèi)容