Java中LinkedList和ArrayList的区别

首先亮一下他们两个基本区别,面试的时候可以用来和面试官唠嗑啊
1、ArrayList实现了基本动态数组结构,Linked基于链表的结构。链表?什么是链表?答:“链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中指针连接次序实现的”注:此句话通过了科普中国百科科学词条编写与应用工作项目的审核。
2、对于get和set,ArrayList的性能优于LinkedList,因为Linked要移动指针,麻烦的很
3、对于add和remove,LinkedList要优于ArrayList,因为链表就擅长这个,ArrayList还要移动数据
LinkedList和ArrayList是两个集合类,用于存储一系列的对象引用(references)。例如我们用ArrayList来存储一系列String或者Integer。那么ArrayList和LinkedList在性能上有什么差别?
假如我们有一个很大的列表,里面的元素已经排好序,我们对这个列进行二分查找(binary search),比较两种List的速度,源码如下:

public class TestList {
    public static final int N = 50000;
    public static List<Integer> values;

    static{
        Integer vals[] = new Integer[N];
        Random random = new Random();
        for(int i=0,currval=0;i<N;i++){
            vals[i] = new Integer(currval);
            currval += random.nextInt(100)+1; 
        }
        values = Arrays.asList(vals);
    }

    static long timeList(List<Integer> lst){
        long start = System.currentTimeMillis();
        for(int i=0;i<N;i++){
            int index = Collections.binarySearch(lst, values.get(i));
            if(index != i){
                System.out.println("error occoured ");
            }
        }
        return System.currentTimeMillis() - start;
    }

    public static void main(String[] args){
        System.out.println("ArrayList的耗时:"+timeList(new ArrayList<Integer>(values)));
        System.out.println("LinkedList的耗时:"+timeList(new LinkedList<Integer>(values)));
    }

}

ArrayList的耗时:12
LinkedList的耗时:5346
很明显,ArrayList的时间明显小于LinkedList。二分法查找使用的是随机访问策略,而LinkedList是不支持快速随机访问的。
下面再看一个对List进行大量增加和删除的例子:

public class ListDemo {
    public static final int N = 50000;

    static long timeList(List<Object> list){
        long start = System.currentTimeMillis();
        Object o = new Object();
        for(int i=0;i<N;i++){
            list.add(o);
        }
        return System.currentTimeMillis() - start;
    }

    public static void main(String[] args) {
        System.out.println("ArrayList的耗时:"+timeList(new ArrayList<Object>()));
        System.out.println("LinkedList的耗时:"+timeList(new LinkedList<Object>()));
    }
}

ArrayList的耗时:5
LinkedList的耗时:4
结果是出乎我的意料之外的,我把N分别设置为了5000、500000他们的耗时都非常接近,看来理论知识与现实情况还有有一定的差距。当我将N增到至500W的时候LinkedList的耗时竟然超过了ArrayList。希望看到我的文章的知道真相的大神们可以给我讲解下,谢谢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值