----| Collection 單列集合接口
---------| List 接口,【遵從】List接口的子類, 有序,可重複
--------------| ArrayList ArrayList底層維護的是一個Object類型的數組
特徵: 查詢速度快,增加,刪除慢
什麼時候用ArrayList來保存數據:數組的查詢要求比較高,增加和刪除使用比較少
的地方:例如 高校圖書管理系統 員工管理系統
| LinkList:底層維護的是一個鏈表
特徵:查找慢,增刪快
| Vector 底層維護的也是一個Object類型的數組,長度也是10和ArrayList一樣,
但是Vector是線程安全的,操作效率低
---------| Set 接口 【遵從】Set接口的子類 無序,不可重複
| HashSet
| TreeSet
***********************************************************************************
ArrayList的特有方法:
不常用
ensureCapacity(int minCapacity); 判斷當前指定的最小元素個數是否是minCapacity
trimToSize(); 截斷底層維護的Object數組元素個數爲Size
查詢快,增刪慢的原理
因爲在底層維護的是一個Object類型的數組,可以利用數組的原理,通過下標來訪問元素
增刪慢:
增加慢是因爲如果增加到數組的有效元素個數最大值,ArrayList會調用grow方法
擴容數組,擴容之後,會有一個copy操作,會把原始數據,進行一個完整拷貝,這個時間很長
刪除慢是因爲刪除的時候會有一個數組整體左移操作,這個操作很浪費時間
1、ArrayList創建的時候默認的Object類型數組元素個數數多少?
2. 調用ArrayList的無參構造函數創建一個ArrayList的對象時,請問默認的容器大小多少?如果長度
不夠用,又自增多少?
ArrayList底層維護的是一個Object類型數組,使用無參構造函數創建ArrayList對象的時候,默認的
Object類型數組元素個數(容量)爲10,當長度不夠的時候,自動增長1.5倍左右。
數組元素個數 + (元素個數 >> 1);
**********************************************************************************
ArrayList與Vector的區別:
* 相同點:
* ArrayList和Vector底層維護的都是一個Object類型的數組
* 不同點:
* 1.ArrayList是線程不同步的,操作效率高
* vector是線程同步的,操作效率低
* 2.ArrayList jdk1.2出現的
* Vector 是jdk1.0出現的
**********************************************************************************
LinkList中特有的方法:
1.方法介紹
addFirst(E e);
addLast(E e);
getFirst();
getLast();
removeFirst();
removeLast();
************************************************************************
| Set接口,遵從接口的子類都有特徵:無序,不可重複
* | HashSet底層使用了一個哈希表來支持,特徵:存取速度快
*
* HashSet的存儲實現原理:
* HashSet裏面添加元素的時候,Hashset會首先調用該元素的hashCode方法
* 得到該元素的哈希值,通過哈希值的移位運算,就可以算出該元素在哈希表中的位置
* 情況1:如果該哈希表中位置沒有任何一個元素,就會將元素放入到該哈希表中
* 情況2:如果計算的該元素應該存放的位置上已經有其他元素,那麼就會調用這個元素的equals和已經在哈希表保存
* 的元素進行比較,如果得到結果爲true,則後來者不能被保存到hash表中,如果爲false 這些元素共存
*
* 無序:添加的元素的順序不一定是你展示出來的數據
* hashCode
* equals
***********************************************************************************************
TreeSet添加自定義元素:
1. 往TreeSet集合中添加元素的時候,如果元素本身具備了自然順序的特徵,那麼就按照自然排序的順序添加
2. 添加自定義元素,這些元素沒有一個自然順序,這裏添加不進入,我們就可以來提供一個當前類的一種比較規則
,要【遵從】Comparable接口,實現compareTo(T o)方法
3. 如果比較元素的時候,compareTo方法返回的是0,表示這個兩個元素是一樣的,那麼這裏不允許添加,認爲
是重複元素 (TreeSet和hashCode、equals方法沒有任何關係)
4. 除了要去元素有自然順序,或者顯示Comparable接口之外,還有一種實現的方式,在創建TreeSet的時候
傳入參數是一個自定義的比較器,這個比較器要求【遵從】Comparator接口
如何創建自定義比較器:
class 類名 implements Comparator {
public compare(Object o1 , Object o2) {
}
}
[發現]
一個自定義類【遵從】了Comparable接口,實現了compareTo方法,這裏又給TreeSet提供了一個比較器
這個自定義比較器是【遵從】Comparator接口,實現了compare方法,同時存在的情況下,TreeSet默認
使用的比較規則是【自定義比較器】規則
在這裏推薦使用自定義比較器
***如果遇到下面這樣的問題可以這樣回答
. 一個元素如果要添加到TreeSet裏面有什麼要求?如何滿足
如果這個元素有自然順序時,則可以按照自然順序添加到TreeSet中,
如果這個元素沒有一個自然順序時,則可以通過下面兩種方式:
(1)提供一個當前類,此類遵從Comparable接口,並實現compareTo方法
(2),自己創建一個比較器類,並遵從Comparator接口,並實現compare接口
*****************************************************************************************************************