@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。
分享到:
相关推荐
net.mindview.util包(Thinking in Java 4#)
import java.util.Collections; import java.util.List; public class CollectionsTest { public static void main(String[] args) { List<Integer> list = new ArrayList(); list.add(100); list.add(-66); ...
在Java编程语言中,`java.util.InputMismatchException`是一个常见的运行时异常,它通常发生在尝试从数据源(如控制台、文件或数据库)读取数据时,遇到的数据类型与预期的不匹配。在这个特定的场景中,问题出在主线...
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-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软件基金会开发的一个Java库,它提供了对集合框架的扩展和增强功能,极大地丰富了Java的集合操作。这个库包含了多种实用的数据结构、算法和集合操作工具,可以提升开发效率并优化...
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
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应用程序中常见的...
Util.js 是一个非常实用的JavaScript库,它封装了一系列常见的功能函数,旨在简化开发过程,提高代码的可复用性和效率。这个库涵盖了多种类别,包括处理数组、浏览器特性、日期操作、函数辅助、数学计算、媒体操作、...
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
Apache Commons Collections主要针对Java的`java.util.Collections`和`java.util.Map`接口进行了扩展。它提供了一系列的实用类和接口,如`ListUtils`、`MapUtils`、`SetUtils`等,这些工具类包含了许多静态方法,...
标题中的"apr-util-1.5.4.tar.gz"是一个开源软件库的归档文件,它属于Apache Portable Runtime (APR)项目的一部分。APR是一个为各种操作系统提供统一API的库,主要用于处理底层系统功能,如文件I/O、网络通信、进程...
C语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言头文件 UTILC语言...
《util-linux源码详解》 在Linux操作系统中,util-linux是一个极为重要的软件包,它包含了大量用于系统管理和维护的实用工具。此包以其丰富的功能和广泛的适用性,成为了Linux开发者和系统管理员不可或缺的工具集。...
USB DFU-util是一种通用串行总线(USB)设备固件升级工具,广泛应用于嵌入式系统和微控制器的固件更新。它基于Device Firmware Upgrade(DFU)规范,该规范由USB Implementers Forum(USB-IF)定义,允许用户通过USB...