Java源码解读之util.ArrayList

http://tech.ddvip.com   2006年11月24日    社区交流

本文详细介绍Java源码解读之util.ArrayList

  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,具体的对象的销毁由垃圾收集器负责。

责编:豆豆技术应用

正在加载评论...