`
C_J
  • 浏览: 127880 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Util Collections Container Analysis in 2009

阅读更多

@Author:cjcj  cj.yangjun@gmail.com <c-j.iteye.com>

题记:

    当我还是个年幼无知的孩童时,就被网络给害了.......

    网络曾经一度传言,遍历List对象Iterator比普通的for循环效率要高,于是乎,今天兴致勃勃的把工程里遍历都改成了Iterator,可在一念之间,做了一个简单的测试才恍然大悟.....另外在测试中竟然发现LinkedList出现OutOfMemoryErr错误...就更让我迷惑了...

 

List接口:

    现在工程中常用的List来存储数据项,其中最常用的应该是ArrayList和LinkedList,抱着知其所以然的态度来窥视下这两个List容器...(文章会慢慢完善)

 

继承关系:

ArrayList的继承关系是:

public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable

 

可以看到

implements List---关联了List接口

Cloneable--是为了clone方法使用

Serializable--基本上为了让对象序列话用于异地JVM调用

 

LinkedList的继承关系是:

public class LinkedList extends AbstractSequentialList
          implements List, Cloneable, java.io.Serializable

 

implements List---关联了List接口

 

存储形式:

ArrayList是用一个动态Object[]数组存储数据..

   /**
     * The array buffer into which the elements of the ArrayList are stored.
     * The capacity of the ArrayList is the length of this array buffer.
     */
    private transient Object elementData[];

初始化赋值操作为:

this.elementData = new Object[initialCapacity];

在JDK1.6 中,这个数组初始化是的大小是10,也就是 new Object[10];

 

add()赋值操作为:

当新增数据时,ArrayList会尝试按照  (当前大小*3)/2 + 1 的递增方式增加存储块..如一下代码:

 

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

LinkedList是用一个私有类private static class Entry 来存储数据

private transient Entry header = new Entry(null, null, null);

初始化时,她的大小为:0

add()赋值操作为:

 private Entry addBefore(Object o, Entry e) {
	Entry newEntry = new Entry(o, e, e.previous);
	newEntry.previous.next = newEntry;
	newEntry.next.previous = newEntry;
	size++;
	modCount++;
	return newEntry;
    }

类似一个双向链表一样增加数据;所以他存储的每个单位的开销要比ArrayList要大

 

测试代码:

List list=new LinkedList();
		for(int i=0 ;i<3000000;++i){
		list.add("tesing--cjcj");
		}	
		long now=System.currentTimeMillis();
		Iterator iter=list.iterator();
		while(iter.hasNext()){
			Object obj=iter.next();
		}
		System.out.println(System.currentTimeMillis()-now);
		now = System.currentTimeMillis();
		for(int i =0;i<list.size();++i){
			Object obj=list.get(i);
		}
		System.out.println(System.currentTimeMillis()-now);

 

测试结果:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

而用ArrayList则不会出现内存溢出.

 

 

 

大致结论:

 ArrayList用的数据结构用for是最快的,存储的容量也比LinkedList要大..适合从后面增加或删除数据和随机查询

 LinkedList则用Iterator比for要快...适合随机增加数据

 

1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。

3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。

4.HashTable使用Enumeration,HashMap使用Iterator。

0
0
分享到:
评论

相关推荐

    net.mindview.util包(Thinking in Java 4#)

    net.mindview.util包(Thinking in Java 4#)

    Collections

    import java.util.Collections; import java.util.List; public class CollectionsTest { public static void main(String[] args) { List&lt;Integer&gt; list = new ArrayList(); list.add(100); list.add(-66); ...

    Exception in thread “main“ java.util.InputMismatchException.pdf

    在Java编程语言中,`java.util.InputMismatchException`是一个常见的运行时异常,它通常发生在尝试从数据源(如控制台、文件或数据库)读取数据时,遇到的数据类型与预期的不匹配。在这个特定的场景中,问题出在主线...

    util-linux-ng-2.17源码(含fdisk)

    util-linux-ng-2.17源码(含fdisk) Here is a list of all documented files with brief descriptions: util-linux-ng-2.17.2/disk-utils/blockdev.c [code] util-linux-ng-2.17.2/disk-utils/cramfs.h [code] ...

    asm-util.jar

    asm-util-1.3.4.jar, asm-util-1.3.5.jar, asm-util-1.4.1.jar, asm-util-1.4.3.jar, asm-util-1.5.1.jar, asm-util-1.5.2.jar, asm-util-1.5.3.jar, asm-util-2.0.jar, asm-util-2.1.jar, asm-util-2.2.1-sources....

    Apache Commons Collections

    Apache Commons Collections是Apache软件基金会开发的一个Java库,它提供了对集合框架的扩展和增强功能,极大地丰富了Java的集合操作。这个库包含了多种实用的数据结构、算法和集合操作工具,可以提升开发效率并优化...

    emory-util-collections-2.1.jar

    jar包,官方版本,自测可用

    elk-util-collections-0.4.0.jar

    jar包,官方版本,自测可用

    elk-util-collections-0.3.2.jar

    jar包,官方版本,自测可用

    elk-util-collections-0.3.1.jar

    jar包,官方版本,自测可用

    ws-commons-util-1.0.2.zip_ws-comm-util.jar

    【标题】"ws-commons-util-1.0.2.zip_ws-comm-util.jar" 提供的是一个名为 ws-commons-util 的库的版本1.0.2,这个库经过压缩打包成ZIP格式,其中包含了 ws-comm-util.jar 文件。这个JAR文件是Java应用程序中常见的...

    Utiljs一些很实用的javaScript函数封装集合

    Util.js 是一个非常实用的JavaScript库,它封装了一系列常见的功能函数,旨在简化开发过程,提高代码的可复用性和效率。这个库涵盖了多种类别,包括处理数组、浏览器特性、日期操作、函数辅助、数学计算、媒体操作、...

    emory-util-collections-2.1-sources.jar

    jar包,官方版本,自测可用

    elk-util-collections-0.3.2-sources.jar

    jar包,官方版本,自测可用

    elk-util-collections-0.3.1-sources.jar

    jar包,官方版本,自测可用

    commons-collections-3.2源码包

    Apache Commons Collections主要针对Java的`java.util.Collections`和`java.util.Map`接口进行了扩展。它提供了一系列的实用类和接口,如`ListUtils`、`MapUtils`、`SetUtils`等,这些工具类包含了许多静态方法,...

    apr-util-1.5.4.tar.gz

    标题中的"apr-util-1.5.4.tar.gz"是一个开源软件库的归档文件,它属于Apache Portable Runtime (APR)项目的一部分。APR是一个为各种操作系统提供统一API的库,主要用于处理底层系统功能,如文件I/O、网络通信、进程...

    C语言头文件 UTIL C语言头文件 UTIL

    C语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言...

    util-linux源码

    《util-linux源码详解》 在Linux操作系统中,util-linux是一个极为重要的软件包,它包含了大量用于系统管理和维护的实用工具。此包以其丰富的功能和广泛的适用性,成为了Linux开发者和系统管理员不可或缺的工具集。...

    USB DFU-util烧写固件

    USB DFU-util是一种通用串行总线(USB)设备固件升级工具,广泛应用于嵌入式系统和微控制器的固件更新。它基于Device Firmware Upgrade(DFU)规范,该规范由USB Implementers Forum(USB-IF)定义,允许用户通过USB...

Global site tag (gtag.js) - Google Analytics