`
小波think
  • 浏览: 5400 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

ArrayList与LinkedList的性能比较

    博客分类:
  • Java
OS 
阅读更多
今天有时间自己也测试了下ArrayList与LinkedList在读写操作的性能,结果如下:
os:winxp sp2 JDK1.5.10 cpu:奔腾D2.8 内存:1G 
在10000条数据下:
结果一:
ArrayList add Method 耗时:0
ArrayList get Method 耗时:15
ArrayList iterator Method 耗时:0
ArrayList remove Method 耗时:79
LinkedList add Method 耗时:15
LinkedList get Method 耗时:266
LinkedList iterator Method 耗时:0
LinkedList remove Method 耗时:0
array size:0
link size:0
结果二:
ArrayList add Method 耗时:15
ArrayList get Method 耗时:0
ArrayList iterator Method 耗时:0
ArrayList remove Method 耗时:78
LinkedList add Method 耗时:16
LinkedList get Method 耗时:266
LinkedList iterator Method 耗时:0
LinkedList remove Method 耗时:15
array size:0
link size:0

比率基本是5:5
在100000条数据下:
ArrayList add Method 耗时:78
ArrayList get Method 耗时:0
ArrayList iterator Method 耗时:16
ArrayList remove Method 耗时:7672
LinkedList add Method 耗时:109
LinkedList get Method 耗时:40547
LinkedList iterator Method 耗时:0
LinkedList remove Method 耗时:16

array size:0
link size:0
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.LinkedList;;

/**
 * 描述:小波think
 * **/
public class Test {

	private static List array = new ArrayList();
	private static List link = new LinkedList();
	private static final int count = 10000;
	
	public static void testArrayListAddMethod(){
		long start = System.currentTimeMillis();
		for(int i=0;i<count;i++){
			array.add(i);
		}
		System.out.println("ArrayList add Method 耗时:"+(System.currentTimeMillis()-start));
	}
	
	public static void testArrayListRemoveMethod(){
		int size = count;
		long start = System.currentTimeMillis();
		for(int i=0;i<size;i++){
			array.remove(i);
			i--;
			size--;
		}
		System.out.println("ArrayList remove Method 耗时:"+(System.currentTimeMillis()-start));
	}
	
	public static void testArrayListGetMethod(){
		long start = System.currentTimeMillis();
		for(int i=0;i<count;i++){
			array.get(i);
			
		}
		System.out.println("ArrayList get Method 耗时:"+(System.currentTimeMillis()-start));
	}
	
	public static void testArrayListIteratorMethod(){
		Iterator it = array.iterator();
		long start = System.currentTimeMillis();
		while(it.hasNext()){
			it.next();
		}
		System.out.println("ArrayList iterator Method 耗时:"+(System.currentTimeMillis()-start));
	}
	
	
	public static void testLinkedListAddMethod(){
		long start = System.currentTimeMillis();
		for(int i=0;i<count;i++){
			link.add(i);
		}
		System.out.println("LinkedList add Method 耗时:"+(System.currentTimeMillis()-start));
	}
	
	public static void testLinkedListRemoveMethod(){
		int size = count;
		long start = System.currentTimeMillis();
		for(int i=0;i<size;i++){
			link.remove(i);
			i--;
			size--;
		}
		System.out.println("LinkedList remove Method 耗时:"+(System.currentTimeMillis()-start));
	}
	
	public static void testLinkedListGetMethod(){
		long start = System.currentTimeMillis();
		for(int i=0;i<count;i++){
			link.get(i);
			
		}
		System.out.println("LinkedList get Method 耗时:"+(System.currentTimeMillis()-start));
	}
	
	public static void testLinkedListIteratorMethod(){
		Iterator it = link.iterator();
		long start = System.currentTimeMillis();
		while(it.hasNext()){
			it.next();
		}
		System.out.println("LinkedList iterator Method 耗时:"+(System.currentTimeMillis()-start));
	}
	
	public static void main(String[] args) {
		testArrayListAddMethod();
		testArrayListGetMethod();
		testArrayListIteratorMethod();
		testArrayListRemoveMethod();
		
		testLinkedListAddMethod();
		testLinkedListGetMethod();
		testLinkedListIteratorMethod();
		testLinkedListRemoveMethod();
		
		System.out.println("array size:"+array.size());
		System.out.println("link size:"+link.size());
	}

}
分享到:
评论
13 楼 jerry 2009-02-18  
redduke1202 写道

如果你add的时候只往最后插,那么LinkedList显然没有ArrayList有优势
LinkedList的优势在于往中间insert数据,另外你的romove测试,似乎只remove了一半数据?


你可以作一个试验,就是向中间插,奇怪的也是ArrayList快。
12 楼 Eastsun 2008-04-22  
你这个:
for(int i=0;i<size;i++){   
        link.remove(i);   
        i--;   
        size--;   
}   

完全等同于:
for(int i=0;i<size;i++){
    link.remove(0);
}   

我想这不是你的本意吧。

还有,用的着为LinkedList与ArrayList各写一套功能完全一样的测试方法么?

而且你的测试代码大有问题,不能作为一个严谨的测试来用。
11 楼 小波think 2008-04-22  
Eastsun 写道
小波think 写道
	public static void testLinkedListRemoveMethod(){
		int size = count;
		long start = System.currentTimeMillis();
		for(int i=0;i<size;i++){
			link.remove(i);
			i--;
			size--;
		}
		


这代码写的太有创意了-_-

Eastsun 兄弟 这段代码你觉得怎么写才好啊  呵呵 请指教
10 楼 小波think 2008-04-22  
默认是10
9 楼 aids198311 2008-04-22  
大家可能忽略了一个重要的问题:ArrayList的初始化。
ArrayList如果没定义大小,会初始化为一个固定的大小(具体多少忘记了,反正比较小),加数据时,超出大小后会涉及到数组的COPY和创建。很影响效率的!
比较一下
List array = new ArrayList();

List array = new ArrayList(100000);

的时间差!
8 楼 Eastsun 2008-04-22  
小波think 写道
	public static void testLinkedListRemoveMethod(){
		int size = count;
		long start = System.currentTimeMillis();
		for(int i=0;i<size;i++){
			link.remove(i);
			i--;
			size--;
		}
		


这代码写的太有创意了-_-
7 楼 小波think 2008-04-22  
yuankai 写道
如果是插入的话ArrayList是要比LinkList快的,如果是查询的话LinkList肯定要比ArrayList快。LinkList在插入数据的时候在内存中是要先排序的,所以插入的时候就比ArrayList慢,查询的话就快。这个跟数据库中建索引一样。

同样是调用get(index)方法因该是ArrayList快,如果是iterator 的形式是LinkedList快
6 楼 yuankai 2008-04-22  
如果是插入的话ArrayList是要比LinkList快的,如果是查询的话LinkList肯定要比ArrayList快。LinkList在插入数据的时候在内存中是要先排序的,所以插入的时候就比ArrayList慢,查询的话就快。这个跟数据库中建索引一样。
5 楼 小波think 2008-04-22  
Rocwo 写道
为啥在100000条数据下执行add Method的时候,
LinkedList比ArrayList要慢呢?

在10000下有时ArryList比LinkedList慢,有时又比LinkedList快.
请高手说明哈 呵呵

发重了呵呵
4 楼 小波think 2008-04-22  
Rocwo 写道
为啥在100000条数据下执行add Method的时候,
LinkedList比ArrayList要慢呢?

在10000下有时ArryList比LinkedList慢,有时又比LinkedList快.
请高手说明哈 呵呵
3 楼 小波think 2008-04-22  
redduke1202 写道
如果你add的时候只往最后插,那么LinkedList显然没有ArrayList有优势
LinkedList的优势在于往中间insert数据,另外你的romove测试,似乎只remove了一半数据?

是的 犯了个低级错误忘写i--了 呵呵 谢谢redduke1202的提醒!
因为在我以前看的书里讲的是,ArrayList的add方法和remove方法都比LinkedList的慢很多.ArrayList方法更适合用来读多写少的情况下用.
我没测试add(index,Object)方法 因为平时我用的多的还是add(Object).
2 楼 Rocwo 2008-04-22  
为啥在100000条数据下执行add Method的时候,
LinkedList比ArrayList要慢呢?
1 楼 redduke1202 2008-04-22  
如果你add的时候只往最后插,那么LinkedList显然没有ArrayList有优势
LinkedList的优势在于往中间insert数据,另外你的romove测试,似乎只remove了一半数据?

相关推荐

    java 中ArrayList与LinkedList性能比较

    ArrayList与LinkedList性能比较在java中 ArrayList和LinkedList是java中两个常用的实现List接口的类,它们之间的性能比较是一个非常重要的知识点。 首先,让我们来了解ArrayList和LinkedList的实现原理。ArrayList...

    ArrayList LinkedList Vector性能测试

    在Java编程语言中,ArrayList、...而Vector虽然提供了线程安全,但其性能通常低于ArrayList和LinkedList,更适合于多线程环境且对性能要求不那么敏感的应用。在实际开发中,选择哪种数据结构应根据具体需求来决定。

    ArrayList LinkedList Vector性能对比

    总之,理解ArrayList、LinkedList和Vector的内部工作原理和性能特征,可以帮助我们做出更明智的选择,优化代码性能,并避免不必要的资源消耗。在深入源码阅读和实践过程中,我们可以更深入地理解这些类的设计思想和...

    ArrayList和Linkedlist1

    总的来说,理解ArrayList和LinkedList的基本特性和应用场景,以及如何处理与之相关的安全性问题,是Java程序员必备的知识。通过深入学习和实践,可以更好地利用这些数据结构提升程序效率和质量。

    05丨ArrayList还是LinkedList?使用不当性能差千倍.html

    05丨ArrayList还是LinkedList?使用不当性能差千倍.html

    ArrayList LinkedList Vector区别

    ArrayList、LinkedList、Vector 是 Java 中常用的数据结构实现类,它们都实现了 List 接口,但它们在存储方式、性能、线程安全性等方面有着不同特点。 首先,ArrayList 和 Vector 都是采用数组方式存储数据的,这种...

    Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度1

    在 Java 中,ArrayList 和 LinkedList 是两种常用的集合类,它们各自具有不同的特性和适用场景,主要体现在数据结构、访问效率和操作性能上。 1. 数据结构: - ArrayList 实现了一个动态数组,它内部是一个 Object...

    关于arraylist和linkedList的区别

    ### 关于ArrayList与LinkedList的区别 在Java编程语言中,`ArrayList`与`LinkedList`都是`List`接口的具体实现类,用于存储元素集合。虽然它们都实现了同样的接口并且提供了相同的基本功能,但在内部实现机制、性能...

    合理运用ArrayList与LinkedList

    第二个代码示例则比较了从ArrayList和LinkedList中读取100000个元素的时间。在ArrayList中,由于元素存储连续,直接按索引访问几乎瞬间完成。然而,当使用LinkedList时,由于需要从头开始遍历链表,耗时显著增加。 ...

    比较ArrayList、LinkedList、Vector1

    - **实现原理**:Vector与ArrayList类似,也是基于动态数组,但它是线程安全的。 - **线程安全**:每个公共方法都在内部进行了同步,这意味着在多线程环境下无需额外的同步代码。 - **效率**:由于线程安全的实现...

    arraylist-linkedlist-test.zip

    本文件"arraylist-linkedlist-test.zip"主要探讨了在执行添加和删除元素操作时,LinkedList相对于ArrayList的性能优势。 ArrayList是基于动态数组的数据结构,它在内存中连续存储元素。由于数组的特性,访问任意...

    ArrayList-LinkedList-源码.rar

    《ArrayList与LinkedList源码解析》 在Java编程中,ArrayList和LinkedList是两种常见的动态数组,它们都是Java集合框架的一部分,提供了对元素存储和操作的功能。本篇将深入探讨ArrayList和LinkedList的内部实现...

    Java中ArrayList和LinkedList区别

    在Java编程语言中,ArrayList和LinkedList都是集合框架中两种重要的列表实现,它们分别基于不同的数据结构,具有不同的特性和性能特点。以下是对这两个类的详细分析: 1. 数据结构: - ArrayList是基于动态数组的...

    ArrayList Vector LinkedList 区别与用法.

    ### ArrayList、Vector、LinkedList 的区别与用法详解 在Java编程中,选择合适的数据结构对于程序的性能至关重要。本文将深入探讨ArrayList、Vector和LinkedList三种集合类的特点与使用场景,帮助开发者更好地理解...

    当面试官问我ArrayList和LinkedList哪个更占空间时,我这么答让他眼前一亮

    ArrayList和LinkedList的比较与实现原理 在 Java 中,ArrayList 和 LinkedList 是两个常用的集合类,它们都是 List 接口的实现类,但它们之间有着鲜明的区别。今天,我们将深入探讨这两个集合类的实现原理和比较。 ...

    java中ArrayList与LinkedList对比详情

    Java 中 ArrayList 与 LinkedList 对比详情 在 Java 中,ArrayList 和 LinkedList 是两个常用的集合实现方式,它们都实现了 Collection 接口,但是它们之间存在着一些关键的差异。本文将通过实例对比 Java 中 ...

    对比Vector、ArrayList、LinkedList1

    - **插入与删除**:LinkedList在插入和删除元素时具有较高的效率,特别是对于头部和尾部的操作,因为不需要移动其他元素。但在进行随机访问时,由于需要遍历链表,其效率低于ArrayList和Vector。 - **适用场景**:...

    Map+List+ArrayList+LinkedList Java源码

    Java编程语言中的`Map`, `List`, `ArrayList` 和 `LinkedList` 是四个核心的数据结构,它们在实际开发中被广泛使用。了解它们的源码对于深入理解Java集合框架的内部工作原理至关重要,尤其是对初学者而言,这有助于...

    java基础--list(ArrayList、LinkedList、匿名类).docx

    【Java基础——List接口详解(ArrayList、LinkedList、匿名类)】 在Java编程中,List接口是集合框架的重要组成部分,提供了有序存储元素的功能。ArrayList和LinkedList是List接口的两种主要实现,它们各有优缺点,...

Global site tag (gtag.js) - Google Analytics