ArrayList和LinkedList的操作性能对比

ArrayList和LinkedList都是实现了Collection和List接口,继承AbstractList的链表。

  • ArrayList

    List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于Vector 类,除了此类是不同步的。)

  • LinkedList::

    List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾getremoveinsert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列 (deque)。

下面就根据几个示例才测试一下它们之间使用的性能区别:

  1. 我们创建一个成员变量List list;在不同的testcase中分别实例化为ArrayList和LinkedList,然后往各个列表中添加100000条数据,根据操作前后的时间差来判断他们的插入性能;
    package org.wxp.collection;
    
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    
    import junit.framework.TestCase;
    
    /**
     * 测试LinkedList和ArrayList的添加性能
     * 
     * @author Champion.Wong
     * 
     */
    public class Test_List01 extends TestCase {
        private List list = null;
        private long start = 0;
        private long end = 0;
    
        /**
         * 测试LinkedList的插入性能
         */
        public void test() {
            list = new LinkedList();
            start = System.currentTimeMillis(); // 记录执行操作前时间
            for (int i = 0; i < 1000000; i++) {
                list.add("Hello java.");
            }
            end = System.currentTimeMillis();// 记录执行操作后时间
    
            System.out.println("LinkedList用时:" + (end - start));
        }
    
        /**
         * 测试ArrayList的插入性能
         */
        public void test1() {
            list = new ArrayList();
            start = System.currentTimeMillis();// 记录执行操作前时间
            for (int i = 0; i < 1000000; i++) {
                list.add("Hello java.");
            }
            end = System.currentTimeMillis();// 记录执行操作后时间
    
            System.out.println("ArrayList用时:" + (end - start));
        }
    }
    
    
    
    执行后的控制台结果为:
  2. 我们创建一个成员变量List list;在不同的testcase中分别实例化为ArrayList和LinkedList,然后往各个列表中添加100000条数据。然后遍历这些集合,根据操作前后的时间差来判断他们的插入性能;
    package org.wxp.collection;
    
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    
    import junit.framework.TestCase;
    
    /**
     * 测试LinkedList和ArrayList的遍历性能
     * 
     * @author Champion.Wong
     * 
     */
    public class Test_List02 extends TestCase {
    	private List list = null;
    	private long start = 0;
    	private long end = 0;
    
    	public void test() {
    		list = new LinkedList();
    		for (int i = 0; i < 100000; i++) {
    			list.add("Hello Java!");
    		}
    
    		start = System.currentTimeMillis();
    		for (int i = 0; i < 100000; i++) {
    			list.get(i);
    		}
    		end = System.currentTimeMillis();
    
    		System.out.println("LinkedList用时:" + (end - start));
    	}
    
    	public void test1() {
    		list = new ArrayList();
    		for (int i = 0; i < 100000; i++) {
    			list.add("Hello Java!");
    		}
    
    		start = System.currentTimeMillis();
    		for (int i = 0; i < 100000; i++) {
    			list.get(i);
    		}
    		end = System.currentTimeMillis();
    
    		System.out.println("ArrayList用时:" + (end - start));
    	}
    }
    

    执行之后的结果为:


    再看看Junit控制台的显示情况:
  3. 我们分别在两个方法里定义一个ArrayList和LinkedList,分别往每个集合中插入100000条数据。ArrayList使用add(object)方法来插入,而LinkedList则使用独自的addFirst(object)和addLast(object)来进行收尾同时插入。
    package org.wxp.collection;
    
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    
    import junit.framework.TestCase;
    
    /**
     * 测试LinkedList和ArrayList的首位操作性能
     * 
     * @author Champion.Wong
     * 
     */
    public class Test_List03 extends TestCase {
    	private long start = 0;
    	private long end = 0;
    
    	public void test() {
    		LinkedList list = new LinkedList();
    
    		start = System.currentTimeMillis();
    		for (int i = 0; i < 100000; i++) {
    			list.addFirst("hello first!");
    			list.addLast("hello first!");
    		}
    		end = System.currentTimeMillis();
    
    		System.out.println("LinkedList用时:" + (end - start));
    	}
    
    	public void test1() {
    		ArrayList list = new ArrayList();
    
    		start = System.currentTimeMillis();
    		for (int i = 0; i < 100000; i++) {
    			list.add("hello first");
    			list.add("hello last");
    		}
    		end = System.currentTimeMillis();
    
    		System.out.println("ArrayList用时:" + (end - start));
    	}
    }
    

    再来看看执行结果:

由以上测试结果可以看出:

ArrayList在遍历和普通插入(add(object))的性能上都优于LinkedList。但是LinkedList在首尾进行操作的性能上明显优于ArrayList.


并且,ArrayList和LinkedList的操作方法都不是同步的,在并发操作时,不能保证其合理性,在创建的时候可以保证外部同步:

List arrayList = Collections.synchronizedList(new ArrayList(...));
List linkedList = Collections.synchronizedList(new LinkedList(...));

转载请注明出处: http://blog.csdn.net/it_wangxiangpan/article/details/8693803
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值