--------| Collection 接口,集合的總接口
List 有序 可重復(fù)
Set 無序 不可重復(fù)
----| List接口中【特有的方法】:
添加:
add(index, Object o); //在指定位置上放入元素
addAll(int index, Collection c); //在指定位置上添加一個集合
獲取:
Object get(int index); //獲取指定下標(biāo)的元素
int indexOf(Object o); //獲取某個元素的下標(biāo)位置
int lastIndexOf(Object o); //找出指定元素最后一次出現(xiàn)在集合中的位置
List subList(int fromIndex, int toIndex); //獲取子List集合
修改:
set(int index, Object o); //設(shè)置指定下標(biāo)上的元素
迭代:
ListIterator();
ListIterator()
List特有的迭代器
hasNext();
next();
remove();
add(Object o); //在當(dāng)前迭代器指向的位置上,添加元素,其他元素向后移動
set(Object o); //替換next獲取到的元素
nextIndex(); //下一個元素的下標(biāo)
/*
List集合的三種遍歷方式
- for循環(huán)
- 迭代器
- 增強for循環(huán) 非常常用
*/
--------------------------------------------------------------- List集合----------------------------------------------------------
--------| List集合
List 接口 有序 可重復(fù)
ArrayList 【重點】
ArrayList是底層維護了一個Object類型的數(shù)組,這樣的話這個ArrayList既可以保存任意類型的數(shù)據(jù)
特征:
當(dāng)調(diào)用無參構(gòu)造方法ArrayList,這里創(chuàng)建的底層Object類型的數(shù)組元素個數(shù)默認為10
DEFAULT_CAPACITY 10
查詢快,增刪慢
開發(fā)中使用ArrayList比較多的情景:
圖書館,人員管理
----| ArrayList特有方法:
ensureCapacity(int minCapacity); 不常用
判斷當(dāng)前ArrayList里面保存元素內(nèi)容Object數(shù)組,元素個數(shù)是否大于minCapacity
trimToSize(); 不太常用
截斷底層維護的Object類型的數(shù)組,讓數(shù)組容量變成當(dāng)前ArrayList的size值【有效元素個數(shù)】
size();
查詢快, 增刪慢的原理:
查詢快:
ArrayList底層維護是一個Object類型的數(shù)組,可以完成使用數(shù)組的下標(biāo)機制來訪問數(shù)據(jù),這
種訪問形式是非常快的
增加慢:
是因為在添加數(shù)據(jù)的時候,有可能導(dǎo)致ArrayList底層的Object數(shù)組的元素個數(shù)不夠用,那么會
調(diào)用數(shù)組的擴容方法 grow,而擴容方法,是創(chuàng)建了一個新的數(shù)組,數(shù)組的元素個數(shù)大于是老數(shù)組的
1.5倍,這里會利用一些方法,把老數(shù)組里面的元素完完整整的拷貝的到新數(shù)組,這個拷貝過程很占
用時間和內(nèi)存
刪除慢:
因為刪除某一個元素,會導(dǎo)致數(shù)組中該元素之后的數(shù)據(jù),做一個整體的左移,這里也是一個數(shù)組的拷
貝過程,整個過程非常浪費時間
面試題:
1. 如果調(diào)用了ArrayList的無參構(gòu)造方法,那么請問底層維護的Object數(shù)組默認的元素個數(shù)是多少?
如果是調(diào)用這個方法呢 new ArrayList(8);
答:默認元素個數(shù)為10 ,如果調(diào)用了new ArrayList(8) Object數(shù)組,元素個數(shù)為8
2. ArrayList是一個可以自增長的空間,請問,增長的原理是什么?增長的長度是多少?
ArrayList底層維護的是一個Object數(shù)組,默認元素為10,如果添加元素時,當(dāng)前需求的元素空
間超出了Object數(shù)組的元素個數(shù),會調(diào)用底層的grow,進行數(shù)組元素的擴容和拷貝
擴容量是大約1.5倍
新元素個數(shù) = 老元素個數(shù) + (老元素個數(shù) >> 1);
newCapacity = oldCapacity + (olcCapacity >> 1);
----|LinkedList特有方法:
底層維護的是一個鏈表
addFirst(Object o);
addLast(Object o);
getFirst();
getLast();
removeFirst();
removeLast();
--------------------------------------------------------------Set------------------------------------------------------------------
--------| Set 接口 無序 不可重復(fù)
HashSet 底層維護是一個【哈希表】,存儲效率很高!!!
TreeSet
比較器:
Comparable接口 實現(xiàn)compareTo方法
Comparator接口 實現(xiàn)compare方法
發(fā)現(xiàn):
1. 添加元素的時候,每一次都會調(diào)用hashCode方法
2. 重寫equals方法和HashCode方法,也是首先調(diào)用hashCode方法,再來調(diào)用equals方法
----| HashSet存儲原理:【背下來!!!】
向HashSet集合中添加元素,HashSet首先會調(diào)用該元素hashCode方法,獲取該對象的Hash值
通過【移位】運算,計算出,該元素應(yīng)該保存在【哈希表】中哪一個位置
情況1:
該位置沒有任何元素,直接放入
情況2:
該位置存在其他元素,哈希表就會調(diào)用該元素的equals方法,和已經(jīng)保存在哈希表里面的元素進行
比較
如果比較結(jié)果為true 表示相同元素,無法添加
如果比較結(jié)果為false,表示為不同元素,可以添加
哈希表的每一個單元格都是一個桶式結(jié)構(gòu),可以保存多個元素,允許元素共存!!!
TreeSet是一個樹形結(jié)構(gòu)的Set結(jié)構(gòu)
因為TreeSet是一個樹形結(jié)構(gòu),所有的元素都需要進行比較之后才可以放入到Set集合中,而
字符串和自定義類對象是沒有比較的方式和方法的
【要求】在TreeSet里面的所有的元素都要有【比較的方式】或者有【自然順序】
----------------------------------------------------------Map-----------------------------------------------------------------------
--------| Map<K, V> 雙列集合,這是一個接口
HashMap
TreeMap
K:Key 鍵 !!! 唯一值!!! 不允許重復(fù)!!!
V:Value 值 一個鍵(Key)對應(yīng)一個值(Value) 可以重復(fù)的
在Map<K, V> 雙列集合中,保存的只能是一個鍵(Key)值(Value)對!!!
Map中要學(xué)習(xí)的方法:
增
put(K key, V value); 添加一個鍵(Key)值(Value)對
putAll(Map<? extends K, ? extends V> map);
添加一個符合數(shù)據(jù)類型的Map雙列集合
刪
clear(); 清空所有的鍵(Key)值(Value)對
remove(Object key); 根據(jù)Key刪除對應(yīng)的鍵(Key)值(Value)對
改
put(K key, V value); 當(dāng)鍵(Key)存在時,這個操作是重新修改值(Value)
查
size(); 獲取鍵值對個數(shù)
get(Object key); 通過鍵(Key)找出對應(yīng)的值(Value)
containsKey(Object key); 查看這個Key是否在Map中存在
containsValue(Object value); 查看這個Value是否在Map存在
keySet(); 返回所有鍵(Key)Set集合
values(); 返回所有值(Value)Collection集合
----| HashMap 實現(xiàn)類
這里把鍵值對,認為是一個對象,組成一個類,稱之為Entry
class Entry<K, V> {
K key;
V value;
}
這里可以認為在Map集合中,保存的每一個鍵值對都是一個Entry對象,把這些Entry對象獲取出來,
做成一個集合,進行遍歷
entrySet();
Map.Entry