java中的各種集合-下篇

映射表集合關系圖

引言:集是一個集合,它可以快速的查找現有的元素。但是要查看一個元素,我們需要有想要查找元素的精確的副本;這并不是一種非常通用的查找方式;

映射表的概念就由此而來;我們知道某些鍵的信息;并想要查找與之對應的元素;映射表數據結構就是為此設計的;鍵值對!;

1:Map:映射表集合的頂級父類:它是一種鍵值對的形式存儲數據的集合,根據鍵值我們就可準確查詢我們想要查詢的值;

<1>:HashMap:一種對鍵進行散列的映射表。散列或者函數只能作用于鍵,對鍵對應的值不能散列也不能進行比較;

<2>:TreeMap:樹映射表是使用鍵的正順序對值進行排列,并將其組織成搜索樹;和集合一樣如果集合中的元素必須要按照順序訪問我們最好采用散列映射表;查詢元素時;散列表相對而言要更快一點

<3>:WeakHashMap:主要是用來刪除沒用其他引用的集合中的元素;配合Java的垃圾回收機制;

如果有一個值對應的鍵已經不再使用了,由于程序中的任何部分沒有再出現這個鍵;所以這個鍵/值便無法從映射表中刪除;此時就要由WeakHashMap去完成這件事情了;當某個鍵的唯一引用來自于散列表條目時,這張數據結構將和垃圾回收器協作工作一起刪除鍵/值對。

具體機制:WeakHashMap使用弱引用(weak references)保存鍵;WeakReference對象將引用保存到另外一個對象中,即使是散列表鍵;如果某個對象僅僅使用WeakReference引用,就將這個對象的弱引用放入到隊列中;WeakHashMap將周期性地檢查隊列;以便查找新添加的弱引用;

<4>:LinkedHashMap:連接映射表:主要使用來記住插入元素的順序;每次插入元素時,該集合都會為待插入元素找到合適位置;使得表面上看該集合中的元素是無序的;沒當調用get或者put時受影響的條目都會從當前位置刪除,并將該條目放大鏈表的尾部;只有條目在鏈表中的位置會受影響;而散列表中的桶并不會受影響;一個條目總是位于散列碼對應的桶中;

鏈接散列映射表將用訪問順序,而不是插入順序;對映射表的條目進行迭代;

訪問順序對于實現高速緩存的“最近最少使用”原則十分重要。例如:可能希望將訪問頻率高的元素放在內存中;而訪問頻率低的元素就從數據庫中讀取;當在表中找不到元素項目并且表有已經滿時,就可以將迭代器加入到表中;并將枚舉的前幾個勻速刪除,這些就是最近最少使用的幾個元素;

<5>:EnumMap:枚舉集合映射表:是一個鍵類型為枚舉類型的映射表。它可以直接高效的使用一個值數組實現;使用時需要在構造器中指定鍵類型;

EnumMap<Weekday,Employee>?personIncharge = new EnumMap<>(Weekday.class)

<6>:表示散列集映射表:IdentityHashMap,在這個類中,鍵的散列值不是用hashCode函數計算而來的,而是使用System.identityHashCode方法計算的;這種方式是Object.hashCode方法根據兌現的內存地址來計算散列碼時所使用的方式;而且在對兩個對象進行比較時,IdentityHashMap類使用==而不是equals;

也就是說不同的鍵對象,即使內容相同,也被視為是不同的對象;在實現對象遍歷算法時(如對象序列化),這個類十分有用;可以用來跟蹤每個對象的遍歷情況;

<7>:SortedMap:是一個集合接口,暴露了用于排除的比較器對象;并且定義方法可以獲取集合中的子視圖;

<8>:HashTable:和hashMap基本上差不多,以鍵值對形式存儲數據;這里我們主要講他和HashMap的區別:

? ? ? ? A:HashMap幾乎可以等價于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。

? ? ? ? B:HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是線程安全的,多個線程可以共享一個Hashtable;而如果沒有正確的同步的話,多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。

? ? ? ? C:另一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它線程改變了HashMap的結構(增加或者移除元素),將會拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這并不是一個一定發生的行為,要看JVM。這條同樣也是Enumeration和Iterator的區別。

? ? ? ? D:由于Hashtable是線程安全的也是synchronized,所以在單線程環境下它比HashMap要慢。如果你不需要同步,只需要單一線程,那么使用HashMap性能要好過Hashtable。

? ? ? ? E:HashMap不能保證隨著時間的推移Map中的元素次序是不變的

<9>:Properties:Java.util.Properties是對properties這類配置文件的映射。支持key-value類型和xml類型兩種。

總結:Java集合框架的本身并沒有將映射表本身視為一個集合;然而卻可以獲得映射表的視圖;這是實現了一組Collection接口的對象;或者它的子接口視圖;

有三個視圖:分別為鍵集合,值集合,和鍵值對集合;(鍵和鍵值對形成了一個集合),這是因為在映射表中一個鍵只能有一個副本;下面的三種方法將返回3個視圖:

Set keySet();獲取映射表中所有的鍵

Collection values();獲取映射表中所有的值集合

Set<Map.Entry<K,V>> ??entrySet();獲取映射表中所有的鍵集合和鍵值對集合;

當然還有其他返回視圖的方法此處不再贅述!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 893評論 0 1
  • 標簽(空格分隔): Java集合框架 問題思考 什么是集合框架? 為什么用集合框架? 怎么用集合框架? 問題解決 ...
    outSiderYN閱讀 697評論 0 13
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,766評論 18 399
  • 前面已經介紹完了Collection接口下的集合實現類,今天我們來介紹Map接口下的兩個重要的集合實現類HashM...
    Ruheng閱讀 10,488評論 2 38
  • 人思考的操作系統是由一個個概念組成。 聰明不是天生的,是習得的,積累的,是可以不斷成長的,是沒有盡頭的。 衡量一個...
    風吹燕尾閱讀 196評論 0 0