网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.短路运算符:提高性能和简化代码.
.Item 属性.
.Applet与Servlet通讯 (片段源码).
.利用Java实现zip压缩/解压缩.
.javascript实现划词标记+划词搜索.
.Java数据对象技术JDO.
.利用java Api打印JTable.
.java.applet.Applet的 .
.屏蔽.NET自定义开发组件中的属性.
.Java数字签名.
.J2SE1.5新特性之ProcessBuilder.
.全面研读EJB 2.0(2).
.详细的spring入门实例讲解运用.
.Java图形调试器 JSwat 3.2 发布(.
.优秀IT书籍下载集锦100本.
.BEA邮政行业RFID解决方案.
.Adapter在J2SE事件处理中的应用.
.Java核心代码例程之:JNIExample.
.J2EE 1.4 的新特性完全展播.
.用Java实现自动在数据库表中生成.

Java源码解读之util.ArrayList

发表日期:2008-1-5



  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结构性变化的次数。


上一篇:Servlet中如何捕获Session事件? 人气:1107
下一篇:JAR进阶(下) 人气:587
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐