1.不同的集合底層使用了不同的數(shù)據(jù)結(jié)構(gòu)挚瘟,因此使用不同的集合就等于使用了不同的數(shù)據(jù)結(jié)構(gòu)
2.list 有序哄褒,可重復(fù),有下標(biāo)
set 無序埂陆,不可重復(fù)苛白,沒有下標(biāo)
map 的key 無序,不可重復(fù)焚虱,map的key與set存儲元素的特點(diǎn)相同
4.Iterable是一個(gè)接口购裙,里面包含了iterator方法,調(diào)用此方法用來返回Iterator迭代器
Iterator也是一個(gè)接口鹃栽,里面包含了三個(gè)方法
hasNext() 返回一個(gè)Boolean值躏率,用來判斷是否還有下一個(gè)元素
next() 下標(biāo)下移,并返回對應(yīng)的元素
remove() 刪除當(dāng)前下標(biāo)對應(yīng)的元素
因?yàn)閏onllectioon接口繼承了Iterable,所以conllection下的所有集合都可以通過獲取迭代器的方式來遍歷集合
4.collection方法:
add添加元素
size獲取集合元素的個(gè)數(shù)
clear清空集合
isEmpty判斷是否為空
iterator獲取迭代器
toArray把集合轉(zhuǎn)換為數(shù)組
remove刪除指定元素
contain判斷集合中是否包含指定元素
5.關(guān)于ConcurrentModificationExeption異常
當(dāng)集合結(jié)構(gòu)發(fā)生改變時(shí)薇芝,迭代器必須重新獲取蓬抄,否則會出現(xiàn)此異常。
獲取迭代器對象夯到,相當(dāng)于對當(dāng)前集合狀態(tài)拍了一個(gè)快照嚷缭,在迭代時(shí)會參照快照迭代,如果集合發(fā)生改變耍贾,就需要重新獲取迭代器快照阅爽。
補(bǔ)充:使用while循環(huán)加迭代器遍歷集合時(shí),如果使用collection的remove刪除元素會改變集合結(jié)構(gòu)荐开,產(chǎn)生ConcurrentModificationExeption異常优床,因此應(yīng)該使用迭代器Iterator的remove方法,該方法會自動更新迭代器并刪除當(dāng)前下標(biāo)對應(yīng)的元素
6.關(guān)于contain和remove方法
底層會調(diào)用equals方法進(jìn)行比較誓焦,因此放在集合中的元素要重寫equals方法
7.List接口特有的方法
add(index,element) 在指定下表添加元素胆敞,對ArrayList效率不高
get根據(jù)下標(biāo)獲取元素
indexOf() 指定對象第一次出現(xiàn)的下標(biāo)
lastIndexOf() 指定對象最后一次出現(xiàn)的下標(biāo)
remove(index) 刪除指定下標(biāo)元素
set(index) 修改指定下標(biāo)元素
8.ArrayList擴(kuò)容,底層創(chuàng)建了一個(gè)長度為0的數(shù)組杂伟,當(dāng)添加第一個(gè)元素時(shí)擴(kuò)容為10移层,容器填滿后1.5倍擴(kuò)容
建議給定一個(gè)預(yù)估的容量,減少擴(kuò)容次數(shù)赫粥,提高效率
9.Map接口的常用方法
put 向map中添加鍵值對
get 通過key獲取value值
clear 清空
boolean containsKey(Object key) 判斷集合中是否包含key
boolean containsValue 判斷是否包含Value值
10.map.put(K,V)實(shí)現(xiàn)原理
先將K观话,V封裝到Node對象中
調(diào)用K的hashCode方法得到hash值,通過哈希算法轉(zhuǎn)換成數(shù)組下表越平,該下標(biāo)如果沒有任何值就把Node節(jié)點(diǎn)添加到這個(gè)位置
如果下標(biāo)對應(yīng)位置有鏈表频蛔,此時(shí)會拿K的鏈表上的每一個(gè)節(jié)點(diǎn)的K進(jìn)行equals比較,如果返回false就將新的節(jié)點(diǎn)添加到鏈表末尾秦叛,如果有一個(gè)返回了true晦溪,那么會將舊的節(jié)點(diǎn)的Value值覆蓋,替換為新節(jié)點(diǎn)的值
11.map.get(K)實(shí)現(xiàn)原理
先調(diào)用K的hashCode方法得到hash值挣跋,通過位運(yùn)算轉(zhuǎn)化為數(shù)組下標(biāo)绪妹,通過下標(biāo)快速定位到某個(gè)位置具帮,如果這個(gè)位置什么都沒有就返回null,如果有鏈表就用拿K和表中的所有節(jié)點(diǎn)的K比較歧胁,如果為false就返回null包竹,如果為ture就返回對應(yīng)值
12.結(jié)論:HashMap的key會先后調(diào)用hashCode和equals兩個(gè)方法,所以key對象要重寫hashCode和equals方法查库,如果一個(gè)類的equals方法重寫路媚,那么它的hashCode方法必須重寫
13.hashMap的初始化容量必須是2的倍數(shù),官方推薦樊销。這是為了達(dá)到散列均勻整慎,提高效率
13.treeSet底層是二叉樹
二叉樹遵循左小右大原則
遍歷是采用中序遍歷:左根右原則