选择显示字体大小

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

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


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons