--------| Collection 接口,集合的總接口
List 有序 可重復(fù)
Set 無(wú)序 不可重復(fù)
----| List接口中【特有的方法】:
添加:
add(index, Object o); //在指定位置上放入元素
addAll(int index, Collection c); //在指定位置上添加一個(gè)集合
獲取:
Object get(int index); //獲取指定下標(biāo)的元素
int indexOf(Object o); //獲取某個(gè)元素的下標(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)前迭代器指向的位置上尖飞,添加元素文捶,其他元素向后移動(dòng)
set(Object o); //替換next獲取到的元素
nextIndex(); //下一個(gè)元素的下標(biāo)
/*
List集合的三種遍歷方式
- for循環(huán)
- 迭代器
- 增強(qiáng)for循環(huán) 非常常用
*/
--------------------------------------------------------------- List集合----------------------------------------------------------
--------| List集合
List 接口 有序 可重復(fù)
ArrayList 【重點(diǎn)】
ArrayList是底層維護(hù)了一個(gè)Object類型的數(shù)組,這樣的話這個(gè)ArrayList既可以保存任意類型的數(shù)據(jù)
特征:
當(dāng)調(diào)用無(wú)參構(gòu)造方法ArrayList,這里創(chuàng)建的底層Object類型的數(shù)組元素個(gè)數(shù)默認(rèn)為10
DEFAULT_CAPACITY 10
查詢快道伟,增刪慢
開發(fā)中使用ArrayList比較多的情景:
圖書館迹缀,人員管理
----| ArrayList特有方法:
ensureCapacity(int minCapacity); 不常用
判斷當(dāng)前ArrayList里面保存元素內(nèi)容Object數(shù)組,元素個(gè)數(shù)是否大于minCapacity
trimToSize(); 不太常用
截?cái)嗟讓泳S護(hù)的Object類型的數(shù)組蜜徽,讓數(shù)組容量變成當(dāng)前ArrayList的size值【有效元素個(gè)數(shù)】
size();
查詢快祝懂, 增刪慢的原理:
查詢快:
ArrayList底層維護(hù)是一個(gè)Object類型的數(shù)組,可以完成使用數(shù)組的下標(biāo)機(jī)制來(lái)訪問數(shù)據(jù)拘鞋,這
種訪問形式是非逞馀睿快的
增加慢:
是因?yàn)樵谔砑訑?shù)據(jù)的時(shí)候,有可能導(dǎo)致ArrayList底層的Object數(shù)組的元素個(gè)數(shù)不夠用盆色,那么會(huì)
調(diào)用數(shù)組的擴(kuò)容方法 grow灰蛙,而擴(kuò)容方法,是創(chuàng)建了一個(gè)新的數(shù)組隔躲,數(shù)組的元素個(gè)數(shù)大于是老數(shù)組的
1.5倍摩梧,這里會(huì)利用一些方法,把老數(shù)組里面的元素完完整整的拷貝的到新數(shù)組宣旱,這個(gè)拷貝過(guò)程很占
用時(shí)間和內(nèi)存
刪除慢:
因?yàn)閯h除某一個(gè)元素仅父,會(huì)導(dǎo)致數(shù)組中該元素之后的數(shù)據(jù),做一個(gè)整體的左移浑吟,這里也是一個(gè)數(shù)組的拷
貝過(guò)程笙纤,整個(gè)過(guò)程非常浪費(fèi)時(shí)間
面試題:
1. 如果調(diào)用了ArrayList的無(wú)參構(gòu)造方法,那么請(qǐng)問底層維護(hù)的Object數(shù)組默認(rèn)的元素個(gè)數(shù)是多少组力?
如果是調(diào)用這個(gè)方法呢 new ArrayList(8);
答:默認(rèn)元素個(gè)數(shù)為10 省容,如果調(diào)用了new ArrayList(8) Object數(shù)組,元素個(gè)數(shù)為8
2. ArrayList是一個(gè)可以自增長(zhǎng)的空間燎字,請(qǐng)問腥椒,增長(zhǎng)的原理是什么阿宅?增長(zhǎng)的長(zhǎng)度是多少?
ArrayList底層維護(hù)的是一個(gè)Object數(shù)組寞酿,默認(rèn)元素為10家夺,如果添加元素時(shí),當(dāng)前需求的元素空
間超出了Object數(shù)組的元素個(gè)數(shù)伐弹,會(huì)調(diào)用底層的grow猖毫,進(jìn)行數(shù)組元素的擴(kuò)容和拷貝
擴(kuò)容量是大約1.5倍
新元素個(gè)數(shù) = 老元素個(gè)數(shù) + (老元素個(gè)數(shù) >> 1);
newCapacity = oldCapacity + (olcCapacity >> 1);
----|LinkedList特有方法:
底層維護(hù)的是一個(gè)鏈表
addFirst(Object o);
addLast(Object o);
getFirst();
getLast();
removeFirst();
removeLast();
--------------------------------------------------------------Set------------------------------------------------------------------
--------| Set 接口 無(wú)序 不可重復(fù)
HashSet 底層維護(hù)是一個(gè)【哈希表】,存儲(chǔ)效率很高1感臁6T摹回论!
TreeSet
比較器:
Comparable接口 實(shí)現(xiàn)compareTo方法
Comparator接口 實(shí)現(xiàn)compare方法
發(fā)現(xiàn):
1. 添加元素的時(shí)候傀蓉,每一次都會(huì)調(diào)用hashCode方法
2. 重寫equals方法和HashCode方法葬燎,也是首先調(diào)用hashCode方法缚甩,再來(lái)調(diào)用equals方法
----| HashSet存儲(chǔ)原理:【背下來(lái)I猛!浩蓉!】
向HashSet集合中添加元素,HashSet首先會(huì)調(diào)用該元素hashCode方法驾窟,獲取該對(duì)象的Hash值
通過(guò)【移位】運(yùn)算绅络,計(jì)算出嘁字,該元素應(yīng)該保存在【哈希表】中哪一個(gè)位置
情況1:
該位置沒有任何元素纪蜒,直接放入
情況2:
該位置存在其他元素纯续,哈希表就會(huì)調(diào)用該元素的equals方法猬错,和已經(jīng)保存在哈希表里面的元素進(jìn)行
比較
如果比較結(jié)果為true 表示相同元素茸歧,無(wú)法添加
如果比較結(jié)果為false软瞎,表示為不同元素,可以添加
哈希表的每一個(gè)單元格都是一個(gè)桶式結(jié)構(gòu)鳖藕,可以保存多個(gè)元素吊奢,允許元素共存R彻觥F毯恰!
TreeSet是一個(gè)樹形結(jié)構(gòu)的Set結(jié)構(gòu)
因?yàn)門reeSet是一個(gè)樹形結(jié)構(gòu)幻林,所有的元素都需要進(jìn)行比較之后才可以放入到Set集合中沪饺,而
字符串和自定義類對(duì)象是沒有比較的方式和方法的
【要求】在TreeSet里面的所有的元素都要有【比較的方式】或者有【自然順序】
----------------------------------------------------------Map-----------------------------------------------------------------------
--------| Map<K, V> 雙列集合整葡,這是一個(gè)接口
HashMap
TreeMap
K:Key 鍵 !!! 唯一值!!! 不允許重復(fù)!!!
V:Value 值 一個(gè)鍵(Key)對(duì)應(yīng)一個(gè)值(Value) 可以重復(fù)的
在Map<K, V> 雙列集合中,保存的只能是一個(gè)鍵(Key)值(Value)對(duì)T饩印!端壳!
Map中要學(xué)習(xí)的方法:
增
put(K key, V value); 添加一個(gè)鍵(Key)值(Value)對(duì)
putAll(Map<? extends K, ? extends V> map);
添加一個(gè)符合數(shù)據(jù)類型的Map雙列集合
刪
clear(); 清空所有的鍵(Key)值(Value)對(duì)
remove(Object key); 根據(jù)Key刪除對(duì)應(yīng)的鍵(Key)值(Value)對(duì)
改
put(K key, V value); 當(dāng)鍵(Key)存在時(shí)损谦,這個(gè)操作是重新修改值(Value)
查
size(); 獲取鍵值對(duì)個(gè)數(shù)
get(Object key); 通過(guò)鍵(Key)找出對(duì)應(yīng)的值(Value)
containsKey(Object key); 查看這個(gè)Key是否在Map中存在
containsValue(Object value); 查看這個(gè)Value是否在Map存在
keySet(); 返回所有鍵(Key)Set集合
values(); 返回所有值(Value)Collection集合
----| HashMap 實(shí)現(xiàn)類
這里把鍵值對(duì)成翩,認(rèn)為是一個(gè)對(duì)象赦役,組成一個(gè)類,稱之為Entry
class Entry<K, V> {
K key;
V value;
}
這里可以認(rèn)為在Map集合中术羔,保存的每一個(gè)鍵值對(duì)都是一個(gè)Entry對(duì)象级历,把這些Entry對(duì)象獲取出來(lái)叭披,
做成一個(gè)集合涩蜘,進(jìn)行遍歷
entrySet();
Map.Entry