您的位置:首页 > 职场人生

ArrayList和LinkedList的区别-完整总结

2017-10-23 17:12 316 查看
基于翻看各位前辈文章以及书籍的基础上,分别从存储,元素的检索、插入、删除以及扩容的性能效率方面,比较完整的总结了ArrayList和LinkedList区别,使得更好应对苛刻面试官的提问。
1.ArrayList是实现了基于动态数组的数据结构,每个元素在内存中存储地址是连续的;LinkedList基于链表的数据结构,每个元素内容包扩previous, next, element(其中,previous是该节点的上一个节点,next是该节点的下一个节点,element是该节点所包含的值),也是由于这一性质支持了每个元素在内存中分布存储。
2.为了使得突破动态长度数组而衍生的ArrayList初始容量为10,每次扩容会固定为之前的1.5倍,所以当你ArrayList达到一定量之后会是一种很大的浪费,并且每次扩容的过程是内部复制数组到新数组;LinkedList的每一个元素都需要消耗一定的空间
3.对于每个元素的检索,ArrayList要优于LinkedList。因为ArrayList从一定意义上来说,就是复杂的数组,所以基于数组index的 
检索性能显然高于通过for循环来查找每个元素的LinkedList。
4.元素插入删除的效率对比,要视插入删除的位置来分析,各有优劣
在列表首位添加(删除)元素,LnkedList性能远远优于ArrayList,原因在于ArrayList要后移(前移)每个元素的索引和数组扩容(删除元素时则不需要扩容)。(测试的时候当然插入一次是看不出来什么的,我自己测试插入十万次,就会有数组扩容arraycopy的因素)而LinkedList则直接增加元素,修改原第一元素该节点的上一个节点即可,删除同理
在列表中间位置添加(删除)元素,总的来说位置靠前则LnkedList性能优于ArrayList,靠后则相反。出现这种情况的原因在于ArrayList性能主要损耗在后移(前移)该位置之后的元素索引,而LinkedList损耗在for循环从第一位检索该位置的元素。这个性能反转的临界点不固定,我自己测试插入十万次,在15000次左右损耗时间相比出现变化
在列表末尾位置添加(删除)元素,性能相差不大。
 
附上我的测试程序:
public static void main(String[] args){
        List<Object> a = new ArrayList<Object>();

        LinkedList<Object>b = new LinkedList<Object>();

        int i;

        for(i=0;i<100000;i++)

        {

            a.add(i,i);

        }

        for(i=0;i<100000;i++)

        {

            b.add(i,i);

        }

        long aTime1= System.currentTimeMillis();

        for(i=0;i<100000;i++)

        {

            a.remove(99999-i);

        }

        long aTime2= System.currentTimeMillis();

        long bTime1= System.currentTimeMillis();

        for(i=0;i<100000;i++)

        {

            b.remove(99999-i);

        }

        long bTime2= System.currentTimeMillis();

        System.out.println("aTime:"+(aTime2-aTime1)+"bTime"+(bTime2-bTime1));
}
有错误的地方欢迎指正!
参考文献:
http://blog.csdn.net/langjian2012/article/details/45039349
http://blog.csdn.net/eson_15/article/details/51145788
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息