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

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

Java源碼解讀之util.ArrayList

2019-11-18 15:46:27
字體:
來源:轉載
供稿:網友

  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!! elementData[size++] = o;
 return true;
}

  4.iterator()中的同步

  在父類AbstractList中定義了一個int型的屬性:modCount,記錄了ArrayList結構性變化的次數。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 潮安县| 赞皇县| 福清市| 山西省| 静宁县| 大同县| 平湖市| 那曲县| 微山县| 山阴县| 安塞县| 兴山县| 丽江市| 博野县| 乳山市| 阳新县| 铅山县| 泸溪县| 宜州市| 盐源县| 武山县| 泾阳县| 田林县| 阿拉善右旗| 库尔勒市| 垣曲县| 尼勒克县| 长兴县| 阿克陶县| 东海县| 弥渡县| 阳泉市| 定结县| 秀山| 永吉县| 南靖县| 乌兰浩特市| 绩溪县| 行唐县| 靖西县| 兴文县|