选择显示字体大小

java列表对象的性能分析和测试(1)


  sdk提供了有序集合接口java.util.list的几种实现,其中三种最为人们熟知的是vector、arraylist和linkedlist。有关这些list类的性能差别是一个经常被问及的问题。在这篇文章中,我要探讨的就是linkedlist和vector/arraylist之间的性能差异。

为全面分析这些类之间的性能差异,我们必须知道它们的实现方法。因此,接下来我首先从性能的角度出发,简要介绍这些类的实现特点。

一、vector和arraylist的实现



vector和arraylist都带有一个底层的object[]数组,这个object[]数组用来保存元素。通过索引访问元素时,只需简单地通过索引访问内部数组的元素:

public object get(int index)

{ // 首先检查index是否合法...此处不显示这部分代码 return

elementdata[index]; }

内部数组可以大于vector/arraylist对象拥有元素的数量,两者的差值作为剩余空间,以便实现快速添加新元素。有了剩余空间,添加元素变得非常简单,只需把新的元素保存到内部数组中的一个空余的位置,然后为新的空余位置增加索引值:

public boolean add(object o)

{ ensurecapacity(size + 1); // 稍后介绍 elementdata[size++] = o; return true;

// list.add(object) 的返回值 }

把元素插入集合中任意指定的位置(而不是集合的末尾)略微复杂一点:插入点之上的所有数组元素都必须向前移动一个位置,然后才能进行赋值:

public void add(int index, object element) {

// 首先检查index是否合法...此处不显示这部分代码

ensurecapacity(size+1);

system.arraycopy(elementdata, index, elementdata, index + 1,

size - index);

elementdata[index] = element;

size++;

}

剩余空间被用光时,如果需要加入更多的元素,vector/arraylist对象必须用一个更大的新数组替换其内部object[]数组,把所有的数组元素复制到新的数组。根据sdk版本的不同,新的数组要比原来的大50%或者100%(下面显示的代码把数组扩大100%):

public void ensurecapacity(int mincapacity) {

int oldcapacity = elementdata.length;

if (mincapacity > oldcapacity) {

object olddata[] = elementdata;

int newcapacity = math.max(oldcapacity * 2, mincapacity);

elementdata = new object[newcapacity];

system.arraycopy(olddata, 0, elementdata, 0, size);

}

}

vector类和arraylist类的主要不同之处在于同步。除了两个只用于串行化的方法,没有一个arraylist的方法具有同步执行的能力;相反,vector的大多数方法具有同步能力,或直接或间接。因此,vector是线程安全的,但arraylist不是。这使得arraylist要比vector快速。对于一些最新的jvm,两个类在速度上的差异可以忽略不计:严格地说,对于这些jvm,这两个类在速度上的差异小于比较这些类性能的测试所显示的时间差异。

通过索引访问和更新元素时,vector和arraylist的实现有着卓越的性能,因为不存在除范围检查之外的其他开销。除非内部数组空间耗尽必须进行扩展,否则,向列表的末尾添加元素或者从列表的末尾删除元素时,都同样有着优秀的性能。插入元素和删除元素总是要进行数组复制(当数组先必须进行扩展时,需要两次复制)。被复制元素的数量和[size-index]成比例,即和插入/删除点到集合中最后索引位置之间的距离成比例。对于插入操作,把元素插入到集合最前面(索引0)时性能最差,插入到集合最后面时(最后一个现有元素之后)时性能最好。随着集合规模的增大,数组复制的开销也迅速增加,因为每次插入操作必须复制的元素数量增加了。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

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