一:區(qū)別概述
1:List:可重復(fù),有序,數(shù)組或者鏈表存儲(chǔ)
2:Set:不可重復(fù),無序,使用ma存儲(chǔ)
二:ArrayList
2.1:通過數(shù)組的方式進(jìn)行存儲(chǔ):查詢快,增刪慢的特點(diǎn),但是他的效率高
2.2:初始化過程中若知道數(shù)組的大約范圍,建議制定長(zhǎng)度;若不指定長(zhǎng)度,默認(rèn)初始化大小為10;

2.3:關(guān)注ArrayList兩個(gè)屬性
????????size 和?elementData,其中size可以理解為數(shù)組長(zhǎng)度,elementData理解為容量大?。?/p>
????????比如,List a =new ArrayList(20);?a.add("1");? ? ? ? ? ? ? ? ? ? ?其中size = 1;elementData的長(zhǎng)度為20
2.4:擴(kuò)容問題:
????????每次使用add方法時(shí),會(huì)觸發(fā)擴(kuò)容方法,當(dāng)容量不夠時(shí)候,進(jìn)行擴(kuò)容:


????????擴(kuò)容時(shí)步驟:
????????????1:將size+1,和現(xiàn)在的elementData長(zhǎng)度比較比較
????????????2:若小于現(xiàn)有容量,則不擴(kuò)容;
????????????3:若大于現(xiàn)有容量,則
????????????? ? ????3 .1:備份原數(shù)組;
? ????????????? ? ? 3.2:擴(kuò)容為原來大小的1.5倍
? ? ????????????? ? 3.2:通過Arrays.copyOf(elementData, newCapacity)方法返回?cái)U(kuò)容后的數(shù)據(jù)。
2.5:刪除(remove)
? a:傳空參數(shù)的情況是全刪呀!??!
? b:主要使用了一個(gè)方法:fastRemove(int index),每次remove都是進(jìn)行一次數(shù)組拷貝,remove 后size會(huì)變化


2.6 迭代
? ?方式1:Iterator迭代器

方式2:foreach

錯(cuò)誤方式:

錯(cuò)誤方式分析:
a: ArrayList extents? AbstractList,AbstractList類有一個(gè)變量modCount,記錄數(shù)組的變化次數(shù);

每次對(duì)數(shù)組進(jìn)行增刪操作時(shí)候,都會(huì)進(jìn)行modCount++;

b:Iteratoriterator = a.iterator(); 是實(shí)例化一個(gè)AbstractList的內(nèi)部類Itr;實(shí)例化時(shí),初始化expectedModCount =modCount;
每次使用next方法時(shí),會(huì)調(diào)用checkForComodification(),這個(gè)方法是比較expectedModCount和modCount;若不相等,就報(bào)錯(cuò)。

c:正確案例中,用了內(nèi)部類Itr的remove方法,這個(gè)方法最后會(huì)強(qiáng)制expectedModCount=modCount;

d:錯(cuò)誤案例中,使用了ArrayList類的remove,只會(huì)減小modCount,不會(huì)強(qiáng)制expectedModCount=modCount;所以刪除一次后,expectedModCount<modCount,不會(huì)通過校驗(yàn),失敗。
三:LinkedList (直接抄的博客的)
?????a:是由node節(jié)點(diǎn)組成的雙向鏈表,沒有初始化容量,不存在擴(kuò)容概念;
? ? b:node節(jié)點(diǎn)的結(jié)構(gòu)如下

c:每當(dāng)有新數(shù)據(jù)添加的時(shí)候,會(huì)將元素添加到鏈表的最后位置,并將元素的prev 指向前一個(gè)元素,前一個(gè)元素的next指向需要添加的元素;

