ArrayList和Vector
ArrayList
ArrayList的注意實作
1.ArrayList可以加入null,并且多個
2.ArrayList是由陣列來實作資料存盤的
3.ArrayList基本等同于Vector,除了ArrayList是執行緒不安全(執行效率高),在多執行緒情況下,不建議使用ArrayList
ArryList的底層操作機制原始碼分析
1.arrayList中維護了一個Object型別的陣列elementData,【debug看原始碼】transient Object[] elementData;//transient 表示瞬間,短暫的,表示該屬性不會被序列化
2.當創建ArrayList物件時,如果使用無參構造器,則初始elementData容量為0,第一次添加,則擴容elementData為10,如果需要再次擴容,則擴容elementData為1.5倍
3.如果使用的是指定大小的構造器,則初始elementData容量指定大小,如果需要擴容,則直接擴容elementData為1.5倍,
debug除錯以下代碼,查看原始碼
import java.util.ArrayList;
@SuppressWarnings({"all"})
public class ArrayListSource {
public static void main(String[] args) {
//解讀原始碼
//注意,注意,注意,Idea 默認情況下,Debug 顯示的資料是簡化后的,如果希望看到完整的資料
//需要做設定. //使用無參構造器創建 ArrayList 物件
//ArrayList list = new ArrayList();
ArrayList list = new ArrayList(8);
//使用 for 給 list 集合添加 1-10 資料
for (int i = 1; i <= 10; i++) {
list.add(i);
}
//使用 for 給 list 集合添加 11-15 資料
for (int i = 11; i <= 15; i++) {
list.add(i);
}
list.add(100);
list.add(200);
list.add(null);
}
}
Vector
Vector介紹
1.Vector類的定義說明:
public class Vector<E> extens AbstractList<E> implements List<E>,RandomAccess,Cloneable,Serializable
2.Vector 底層也是一個物件陣列
3.Vector是執行緒同步的,即執行緒安全,Vector類的操作方法帶有 synchronized
4.在開發中,需要執行緒同步安全時,考慮使用Vector
package List_.Vector_;
import java.util.Vector;
@SuppressWarnings({"all"})
public class Vector_ {
public static void main(String[] args) {
//無參構造器
//有引數的構造
Vector vector = new Vector(8);
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);
}
補充:如果是 Vector vector = new Vector(8);
走的方法:
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
2. vector.add(i)
2.1 //下面這個方法就添加資料到 vector 集合
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
2.2 //確定是否需要擴容 條件 : minCapacity - elementData.length>0
private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
if (minCapacity - elementData.length > 0
grow(minCapacity);
}
2.3 //如果 需要的陣列大小 不夠用,就擴容 , 擴容的演算法
//newCapacity = oldCapacity + ((capacityIncrement > 0) ?
// capacityIncrement : oldCapacity);
//就是擴容兩倍.
private void grow(int minCapacity) {
// overflow-conscious code
int 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 = https://www.cnblogs.com/Anesthesi/archive/2021/10/21/Arrays.copyOf(elementData, newCapacity);
}
*/
}
}
ArrayList和Vector的比較
ArrayList和Vector的比較
| ArrayList | Vector | |
|---|---|---|
| 底層結構 | 可變陣列 | 可變陣列 |
| 版本 | jdk1.2 | jdk1.0 |
| 執行緒安全(同步效率) | 不安全,效率高 | 安全,效率不高 |
| 擴容倍數 | 如果有參構造1.5倍,如果是無參 :1.第一次10;2.從第二次開始按1.5擴 | 如果是無參,默認10,滿后,就按2倍擴容, 如果指定大小,則每次直接按2倍擴容 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/330021.html
標籤:其他
