Java 集合小結3

集合類型主要有3種:set(集)、list(列表)和map(映射)。
(1)集

集(set)是最簡單的一種集合,它的對象不按特定方式排序,只是簡單的把對象加入集合中,就像往口袋裏放東西。
對集中成員的訪問和操作是通過集中對象的引用進行的,所以集中不能有重複對象。
集也有多種變體,可以實現排序等功能,如TreeSet,它把對象添加到集中的操作將變爲按照某種比較規則將其插入到有序的對象序列中。它實現的是SortedSet接口,也就是加入了對象比較的方法。通過對集中的對象迭代,我們可以得到一個升序的對象集合。

(2)列表
列表的主要特徵是其對象以線性方式存儲,沒有特定順序,只有一個開頭和一個結尾,當然,它與根本沒有順序的集是不同的。
列表在數據結構中分別表現爲:數組和向量、鏈表、堆棧、隊列。

(3)映射
映射與集或列表有明顯區別,映射中每個項都是成對的。映射中存儲的每個對象都有一個相關的關鍵字(Key)對象,關鍵字決定了 對象在映射中的存儲位置,檢索對象時必須提供相應的關鍵字,就像在字典中查單詞一樣。關鍵字應該是唯一的。
關鍵字本身並不能決定對象的存儲位置,它需要對過一種散列(hashing)技術來處理,產生一個被稱作散列碼(hash code)的整數值,散列碼通常用作一個偏置量,該偏置量是相對於分配給映射的內存區域起始位置的,由此確定關鍵字/對象對的存儲位置。理想情況 下,散列處理應該產生給定範圍內均勻分佈的值,而且每個關鍵字應得到不同的散列碼。


集:
  HashSet: 使用HashMap的一個集的實現。雖然集定義成無序,但必須存在某種方法能相當高效地找到一個對象。使用一個HashMap對象實現集的存儲和檢索操作是在固定時間內實現的.
  TreeSet: 在集中以升序對對象排序的集的實現。這意味着從一個TreeSet對象獲得第一個迭代器將按升序提供對象。TreeSet類使用 了一個TreeMap.

列表:
  Vector: 實現一個類似數組一樣的表,自動增加容量來容納你所需的元素。使用下標存儲和檢索對象就象在一個標準的數組中一樣 。你也可以用一個迭代器從一個Vector中檢索對象 Vector是唯一的同步容器類??當兩個或多個線程同時訪問時也是性能良好的。
  Stack: 這個類從Vector派生而來,並且增加了方法實現棧??一種後進先出的存儲結構。
  LinkedList: 實現一個鏈表。由這個類定義的鏈表也可以像棧或隊列一樣被使用。
  ArrayList: 實現一個數組,它的規模可變並且能像鏈表一樣被訪問。它提供的功能類似Vector類但不同步。

映射:
  HashTable: 實現一個映象,所有的鍵必須非空。爲了能高效的工作,定義鍵的類必須實現hashcode()方法和equal()方法。這個類 是前面java實現的一個繼承,並且通常能在實現映象的其他類中更好的使用。
  HashMap: 實現一個映象,允許存儲空對象,而且允許鍵是空(由於鍵必須是唯一的,當然只能有一個)。
  WeakHashMap: 實現這樣一個映象:通常如果一個鍵對一個對象而言不再被引用,鍵/對象對將被捨棄。這與HashMap形成對照,映象 中的鍵維持鍵/對象對的生命週期,儘管使用映象的程序不再有對鍵的引用,並且因此不能檢索對象。
  TreeMap: 實現這樣一個映象,對象是按鍵升序排列的。
  Set和List都是由公共接口Collection擴展而來,所以它們都可以使用一個類型爲Collection的變量來引用。這就意味着任何列表或集構成的集合都可以用這種方式引用,只有映射類除外(但也不是完全排除在外,因爲可以從映射獲得一個列表。)所以說,把一個列表或集傳遞給方法的標準途徑是使用Collection類型的參數。


List小結:

1. 所有的List中只能容納單個不同類型的對象組成的表,而不是Key-Value鍵值對。例如:[ tom,1,c ];
2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
3. 所有的List中可以有null元素,例如[ tom,null,1 ];
4. 基於Array的List(Vector,ArrayList)適合查詢,而LinkedList 適合添加,刪除操作。


Vector : 基於Array的List,其實就是封裝了Array所不具備的一些功能方便我們使用,它不可能走入Array的限制。性能也就不可能超越Array。所以,在可能的情況下,我們要多運用Array。另外很重要的一點就是Vector“synchronized”的,這個也是Vector和ArrayList的唯一的區別。


ArrayList:同Vector一樣是一個基於Array上的鏈表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector優越一些,但是當運行到多線程環境中時,可需要自己在管理線程的同步問題。


LinkedList:LinkedList不同於前面兩種List,它不是基於Array的,所以不受Array性能的限制。它每一個節點(Node)都包含兩方面的內容:1.節點本身的數據(data);2.下一個節點的信息(nextNode)。所以當對LinkedList做添加,刪除動作的時候就不用像基於Array的List一樣,必須進行大量的數據移動。只要更改nextNode的相關信息就可以實現了。這就是LinkedList的優勢。



Set小結:

雖然Set同List都實現了 collection 接口,但是他們的實現方式卻大不一樣。List基本上都是以Array爲基礎。但是Set則是 在HashMap的基礎上來實現的,這個就是Set和List的根本區別。HashSet的存儲方式是把HashMap中的Key作爲Set的對應存儲項。


1. Set實現的基礎是Map(HashMap);
2. Set中的元素是不能重複的,如果使用add(Object obj)方法添加已經存在的對象,則會覆蓋前面的對象




發佈了20 篇原創文章 · 獲贊 12 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章