b2b電子商務(wù)網(wǎng)站推廣銷售新手怎么找客源
List
- ArrayList
- ArrayList注意事項(xiàng)
- ArrayList底層操作機(jī)制-源碼分析(重點(diǎn))
- Vector
- Vector基本介紹
- ——Vector和ArrayList比較
- Vector底層結(jié)構(gòu)和源碼分析
- LinkedList
- 基本介紹
- LinkedList的底層結(jié)構(gòu)和操作機(jī)制
- LinkedList的增刪改查
- ——LinkedList和ArrayList比較
ArrayList
ArrayList注意事項(xiàng)
- permits all elements, including null 。ArrayList 可以加入null,并且多個(gè)。
- ArrayList是由數(shù)組來實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的。
- ArrayList基本等同于Vector,除了ArrayList是線程不安全(執(zhí)行效率高)看源碼,在多線程情況下,不建議使用ArrayList。
public static void main(String[] args) {ArrayList arrayList = new ArrayList();arrayList.add(null);arrayList.add(2);arrayList.add(null);arrayList.add("hello");System.out.println(arrayList);}
ArrayList底層操作機(jī)制-源碼分析(重點(diǎn))
- ArrayList中維護(hù)了一個(gè)Object類型的數(shù)組elementData。[debug看源碼] transient Object[] elementData;
transient表示瞬間,短暫的。表示該屬性不會(huì)被序列化/串行化。 - 當(dāng)創(chuàng)建ArrayList對象時(shí),如果使用的是無參構(gòu)造器,則初始elementData容量為0,第1次添加,則擴(kuò)容elementData為10,如需要再次擴(kuò)容,則擴(kuò)容elementData為1.5倍。
- 如果使用的是指定大小的構(gòu)造器,則初始elementData容量為指定大小,如果需要擴(kuò)容,則直接擴(kuò)容 elementData為1.5倍。
點(diǎn)擊鏈接跳轉(zhuǎn)看韓順平老師的視頻講解
注意,IDEA 默認(rèn)情況下,Debug 顯示的數(shù)據(jù)是簡化后的,如果希望看到完整的數(shù)據(jù)需要做設(shè)置。
Vector
Vector基本介紹
import java.util.Vector;
- Vector類的定義說明
public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable
- Vector底層也是一個(gè)對象數(shù)組
protected Object[] elementData;
- Vector是線程同步的,即線程安全,Vector類的操作方法帶有synchronized
public synchronized E get(int index){if (index >= elementCount)throw new ArraylndexOutOfBoundsException(index);return elementData(index);}
4)在開發(fā)中,需要線程同步安全時(shí),考慮使用Vector
——Vector和ArrayList比較
Vector底層結(jié)構(gòu)和源碼分析
//無參構(gòu)造器
//有參數(shù)的構(gòu)造
Vector vector = new Vector();
for (int i = 0; i < 10; i++) {vector.add(i);
}
vector.add(100);
System.out.println("vector=" + vector);
1. new Vector() 底層public Vector() {this(10);}
補(bǔ)充:如果是 Vector vector = new Vector(8);走的方法:public Vector(int initialCapacity) {this(initialCapacity, 0);}
其中有一個(gè)裝箱過程
2. vector.add(i)
2.1 //下面這個(gè)方法就添加數(shù)據(jù)到vector集合public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;}2.2 //確定是否需要擴(kuò)容 條件 : minCapacity - elementData.length>0private void ensureCapacityHelper(int minCapacity) {// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);}2.3 //如果 需要的數(shù)組大小 不夠用,就擴(kuò)容 , 擴(kuò)容的算法//newCapacity = oldCapacity + ((capacityIncrement > 0) ?// capacityIncrement : oldCapacity);//就是擴(kuò)容兩倍.private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);elementData = Arrays.copyOf(elementData, newCapacity);}
LinkedList
基本介紹
- LinkedList底層實(shí)現(xiàn)了雙向鏈表和雙端隊(duì)列特點(diǎn)
- 可以添加任意元素(元素可以重復(fù)),包括null
- 線程不安全,沒有實(shí)現(xiàn)同步
LinkedList的底層結(jié)構(gòu)和操作機(jī)制
- LinkedList底層維護(hù)了一個(gè)雙向鏈表
- LinkedList中維護(hù)了兩個(gè)屬性 first和 last分別指向首節(jié)點(diǎn)和尾節(jié)點(diǎn)
- 每個(gè)節(jié)點(diǎn)(Node對象),里面又維護(hù)了prev、next、item三個(gè)屬性,其中通過 prev指向前一個(gè),通過 next指向后一個(gè)節(jié)點(diǎn)。最終實(shí)現(xiàn)雙向鏈表
- 所以 LinkedList的元素的添加和刪除,不是通過數(shù)組完成的,相對來說效率較高
- 模擬一個(gè)簡單的雙向鏈表代碼【代碼】
見LinkedList01.java
LinkedList的增刪改查
見LinkedListCRUD.java
public static void main(String[] args) {LinkedList linkedList = new LinkedList();linkedList.add(1);linkedList.add(2);linkedList.add(3);System.out.println("linkedList=" + linkedList);//演示一個(gè)刪除結(jié)點(diǎn)的linkedList.remove(); // 這里默認(rèn)刪除的是第一個(gè)結(jié)點(diǎn)//linkedList.remove(2);System.out.println("linkedList=" + linkedList);//修改某個(gè)結(jié)點(diǎn)對象linkedList.set(1, 999);System.out.println("linkedList=" + linkedList);//得到某個(gè)結(jié)點(diǎn)對象//get(1) 是得到雙向鏈表的第二個(gè)對象Object o = linkedList.get(1);System.out.println(o);//999//因?yàn)長inkedList 是 實(shí)現(xiàn)了List接口, 遍歷方式System.out.println("===LinkeList遍歷迭代器====");Iterator iterator = linkedList.iterator();while (iterator.hasNext()) {Object next = iterator.next();System.out.println("next=" + next);}System.out.println("===LinkeList遍歷增強(qiáng)for====");for (Object o1 : linkedList) {System.out.println("o1=" + o1);}System.out.println("===LinkeList遍歷普通for====");for (int i = 0; i < linkedList.size(); i++) {System.out.println(linkedList.get(i));}
}
debug查看源碼學(xué)習(xí)
增
刪
有很多種刪除方式
linkedList.remove();//默認(rèn)刪除第一個(gè)節(jié)點(diǎn)
改
查
——LinkedList和ArrayList比較
本筆記是對韓順平老師的Java課程做出的梳理。方便本人和觀看者進(jìn)行復(fù)習(xí)。
課程請見: https://www.bilibili.com/video/BV1fh411y7R8/?spm_id_from=333.999.0.0&vd_source=ceab44fb5c1365a19cb488ab650bab03