国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java 2源碼解讀:java.util.ArrayList

2019-11-18 14:37:48
字體:
來源:轉載
供稿:網友

  ArrayList是List接口的一個可變長數組實現。實現了所有List接口的操作,并答應存儲null值。除了沒有進行同步,ArrayList基本等同于Vector。在Vector中幾乎對所有的方法都進行了同步,但ArrayList僅對writeObject和readObject進行了同步,其它比如add(Object)、remove(int)等都沒有同步。

1.存儲
ArrayList使用一個Object的數組存儲元素。
PRivate transient Object elementData[];
ArrayList實現了java.io.Serializable接口,這兒的transient標示這個屬性不需要自動序列化。下面會在writeObject()方法中具體講解為什么要這樣作。

2.add和remove

public boolean add(Object o) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = o;
return true;
}

注重這兒的ensureCapacity()方法,它的作用是保證elementData數組的長度可以容納一個新元素。在“自動變長機制”中將具體講解。
public Object remove(int index) {
RangeCheck(index);
modCount++;
Object oldValue = elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}

RangeCheck()的作用是進行邊界檢查。由于ArrayList采用一個對象數組存儲元素,所以在刪除一個元素時需要把后面的元素前移。刪除一個元素時只是把該元素在elementData數組中的引用置為null,具體的對象的銷毀由垃圾收集器負責。
modCount的作用將在下面的“iterator()中的同步”中說明。
注:在前移時使用了System提供的一個實用方法:arraycopy(),在本例中可以看出System.arraycopy()方法可以對同一個數組進行操作,這個方法是一個native方法,假如對同一個數組進行操作時,會首先把從源部分拷貝到一個臨時數組,在把臨時數組的元素拷貝到目標位置。

3.自動變長機制
在實例化一個ArrayList時,你可以指定一個初始容量。這個容量就是elementData數組的初始長度。假如你使用:
ArrayList list = new ArrayList();

則使用缺省的容量:10。
public ArrayList() {
this(10);
}

ArrayList提供了四種add()方法,

public boolean add(Object o)

public void add(int index, Object element)

public boolean addAll(Collection c)

public boolean addAll(int index, Collection c)

在每一種add()方法中,都首先調用了一個ensureCapacity(int miniCapacity)方法,這個方法保證elementData數組的長度不小于miniCapacity。ArrayList的自動變長機制就是在這個方法中實現的。
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
elementData = new Object[newCapacity];
System.arraycopy(oldData, 0, elementData, 0, size);
}
}

從這個方法實現中可以看出ArrayList每次擴容,都擴大到原來大小的1.5倍。
每種add()方法的實現都大同小異,下面給出add(Object)方法的實現:
public boolean add(Object o) {
ensureCapacity(size + 1); // Increments modCount!!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 琼海市| 塘沽区| 绵阳市| 濉溪县| 栾川县| 呼和浩特市| 南丹县| 天门市| 乌鲁木齐县| 克什克腾旗| 黑山县| 灌云县| 双鸭山市| 和平区| 延边| 襄樊市| 清原| 肇庆市| 额济纳旗| 崇仁县| 日喀则市| 日照市| 吉木乃县| 焉耆| 长垣县| 舟曲县| 盘锦市| 长岭县| 辉南县| 富锦市| 滕州市| 长岛县| 沙田区| 竹山县| 西和县| 图木舒克市| 阿拉善右旗| 浏阳市| 宜丰县| 厦门市| 陈巴尔虎旗|