java基礎--集合對象數據結構

Collection接口

Collection是最基本的集合接口,由Collection派生出List和Set接口,通過iterator迭代器遍歷集合中的對象。

List接口

List是有序的集合,可以有相同的元素,實現List的接口有LinkedList,ArrayList,Vector。

LinkedList類可以被用作堆棧、隊列或雙向列表,LinkedList沒有同步方法,可以包含null。如果多個線程同時訪問一個List,則必須自己實現訪問同步。解決方法是在創建List時構造一個同步的List:List list = Collections.synchronizedList(new LinkedList(...));

ArrayList類實現了可變大小的數組,允許包含null,不同步。ArrayList實例的容量會隨着不斷增加元素而自動增加,可以調用ensureCapacity方法來增加容量。

Vector類是同步的,因爲Vector是同步的,當一個Iterator被創建而且正在被使用,另一個線程改變了Vector的狀態(例如,添加或刪除了一些元素),這時調用Iterator的方法時將拋出ConcurrentModificationException,因爲必須捕獲該異常。

Set接口

Set是不包含重複元素的集合對象,Set最多有一個null元素。無序的。如果一個Set中的可變元素改變了自身狀態導致Object.equals(Object)=true將導致一些問題。

Map接口

Map中不能包含相同的key,每個key只能映射一個value。

HashTable類實現了接口Map,任何非空的對象都可以作爲key或value。由於作爲key的對象將通過計算其散列函數來確定與之對應的value的位置,因此任何作爲key的對象都必須實現hashCode和equals方法。hashCode和equals方法繼承自根類Object,如果你用自定義的類當作key的話,要相當小心,按照散列函數的定義,如果兩個相同的對象,即obj1.equals(obj2)==true,則它們的hashCode必須相同,但如果兩個對象不同,則它們的hashCode不一定不同。如果兩個不同對象的hashCode相同,這種現象稱爲衝突,衝突會導致操作哈希表的時間開銷增大,所以儘量定義好的hashCode()方法,能加快哈希表的操作。所以hashCode()方法和equals方法必須同時重寫。HashTable是同步的。

HashMap類是非同步的,並且key和value都允許爲空。

總結

  如果涉及到堆棧,隊列等操作,應該考慮用List,對於需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。

  如果程序在單線程環境中,或者訪問僅僅在一個線程中進行,考慮非同步的類,其效率較高,如果多個線程可能同時操作一個類,應該使用同步的類。

  要特別注意對哈希表的操作,作爲key的對象要正確複寫equals和hashCode方法。

  儘量返回接口而非實際的類型,如返回List而非ArrayList,這樣如果以後需要將ArrayList換成LinkedList時,客戶端代碼不用改變。這就是針對抽象編程。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章