Java.util包简介 如何开发应用之一

分类: J2SE   出处:iocblog整理  更新时间:2008-11-28   添加到收藏  


  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;
  }
  

[1] [2] 下一页


Tag: util



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。