一、List接口
List:有序的 collection(也稱為序列)。此接口的用戶可以對列表中每個元素的插入位置進行精確地控制。用戶可以根據元素的整數索引(在列表中的位置)訪問元素,並搜索列表中的元素。 List接口:有序的、允許多個null元素、具體實現常用的有ArrayList、Vector、LinkedList常用實現類有ArrayList、Vector、LinkedList
ArrayList定義及特點
public class ArrayList
- 實現原理,采用動態對象數組實現,默認構造方法創建了一個空數組
- 第一次添加元素,擴展容量為10,之后的擴充算法:原來的數組大小+原數組大小的一半
- 不適合進行刪除或插入操作
- 為了防防止數組動態擴充次數過多,建議在創建時給定初始容量
- 線程不安全,適合在單線程使用,效率較高
Vector定義及特點
public class Vector
- 實現原理,采用動態數組實現,默認構造方法創建了一個大小為10的對象數組
- 擴充的算法:當增量為0時,擴充為原來大小的兩倍,當增量大於0時,擴充為原來大小+增量
- 不適合刪除或插入操作
- 為了防防止數組動態擴充次數過多,建議在創建時給定初始容量
- 線程安全,適合在多線程訪問時使用,效率較低
LinkedList定義及特點
public class LinkedList
- 實現原理,采用雙向鏈表結構實現
- 適合插入、刪除操作,性能高
在實際開發中,如何選擇List接口的具體實現?需要考慮的問題有:
- 安全性問題
- 是否頻繁插入、刪除(LinkedList)
- 是否存儲后遍歷
二、Set接口
一個不包含重復元素的 collection。更確切地講,set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2,並且最多包含一個 null 元素。常用的實現類有HashSet、LinkedHashSet、TreeSet
HashSet定義及特點
public class HashSet
- 實現原理,基於哈希表(HashMap)實現
- 不允許重復,最多可以有一個null元素
- 不保證順序恆久不變
- 添加元素時把元素作為HashMap的key保存,HashMap的value使用一個固定的Object對象
- 排除重復是通過equals方法來檢查對象是否相等
- 判斷兩個對象是否相同,先判斷兩個對象的hashCode是否相同(兩個對象的hashCode相等不一定是同一個對象,但如果不同,一定不是同一個對象),若不同,則兩個對象不是同一個對象;若相同,還要進行equals判斷。equals方法返回true則為同一個對象,返回false則不是同一個對象。
- 自定義類存入HashSet時,建議重寫類的hashCode和equals方法
哈希表的存儲結構:數組+鏈表,數組里的每個元素以鏈表的形式存儲
如何把對象存儲到哈希表中?先計算對象的hashCode值再對數組的長度求余數,來決定對象要存儲在數組中的哪個位置。
TreeSet定義及特點
public class TreeSet
- 基於 TreeMap 的 NavigableSet 實現。使用元素的自然順序對元素進行排序,或者根據創建 set 時提供的 Comparator 進行排序,具體取決於使用的構造方法。
- 有序的,基於TreeMap(二叉樹數據結構)實現,對象需要比較大小,通過對象比較器來實現。對象比較器還可以用來去除重復元素,若自定義的類沒有實現比較器(Comparable)接口,將無法添加到TreeSet中。
LinkedHashSet定義及特點
public class LinkedHashSet
具有可預知迭代順序的 Set 接口的哈希表和鏈接列表實現。此實現與 HashSet 的不同之外在於,后者維護着一個運行於所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序,即按照將元素插入到set 中的順序(插入順序)進行迭代。注意,插入順序不 受在 set 中重新插入的 元素的影響。如果在 s.contains(e) 返回 true 后立即調用 s.add(e),則元素 e 會被重新插入到 set s 中。)
如何選擇Set接口的具體實現?
- 如果要排序,選TreeSet
- 如果不用排序,也不用保證順序,選HashSet
- 如果不用排序,要保證順序,選LinkedHashSet