ArrayList和LinkedList区别

1.ArrayList是实现了基于动态数组(Object[])的数据结构,LinkedList基于链表的数据结构(Node)。 

2.ArrayList初始长度为10,扩容后为1.5*oldCapacity。

3.ArrayList的空间浪费主要体现在扩容后结尾会预留一定的容量空间(可以调用trimSize),LinkedList空间花费体现在它的每个元素新建都需要一定的空间(new Node对象)

4.对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。

5.插入数据时,如果是在集合的前段(大概集合容量的前1/10)处插入数据时,LinkedList性能明显优于ArrayList

当在集合的中部甚至靠后的位置插入大量数据时,ArrayList的性能反而远远优于LinkedList

结论:Linkedlist相较于ArrayList的唯一优势在于集合前段的数据的插入。

具体Demo:

/**
 * Created by flh on 2017/8/28.
 */
import java.util.*;
public class ArrayOrLinked {
    static List<Integer> array=new ArrayList<Integer>();
    static List<Integer> linked=new LinkedList<Integer>();

    public static long getTime(List list){
        long time=System.currentTimeMillis();
        for(int i=0;i<10000;i++){
            int index=Collections.binarySearch(list, list.get(i));
            if(index!=i){
                System.out.println("ERROR!");
            }
        }
        return System.currentTimeMillis()-time;
    }
    public static long insertTime(List list){
        long time=System.currentTimeMillis();
        for(int i=1000;i<10000;i++){
            list.add(1000, i);
        }
        return System.currentTimeMillis()-time;
    }

    public static void main(String[] args) {
        for(int i=0;i<10000;i++){
            array.add(i);
            linked.add(i);
        }
        System.out.println("array time:"+getTime(array));
        System.out.println("linked time:"+getTime(linked));
        System.out.println("array insert time:"+insertTime(array));
        System.out.println("linked insert time:"+insertTime(linked));
    }
}

注意insertTime方法中:

list.add(1000, i);

在十分之一处进行插入,运行结果为:

array time:4
linked time:258
array insert time:26
linked insert time:19

在前部分插入,效率LinkedList>ArrayLsit

代码改为:

list.add(5000, i);

在二分之一处进行插入,运行结果为:

array time:3
linked time:249
array insert time:18
linked insert time:90

在中部及后半部分插入,效率ArrayLsit>LinkedList

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值