ArrayList和LinkedList的区别-完整总结

基于翻看各位前辈文章以及书籍的基础上,分别从存储元素的检索、插入、删除以及扩容的性能效率方面,比较完整的总结了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

 

 

 

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ArrayListLinkedList是两种不同类型的Java集合类。 ArrayList是基于数组实现的,查询和访问元素速度快,但是插入和删除元素速度较慢。 LinkedList是基于链表实现的,插入和删除元素速度快,但是查询和访问元素速度较慢。 总的来说,如果您的应用程序需要频繁地插入和删除元素,则应该使用LinkedList;如果您的应用程序需要频繁地查询和访问元素,则应该使用ArrayList。 ### 回答2: ArrayListLinkedListJava集合框架中常用的两种数据结构。 ArrayList是基于动态数组的实现,内部使用数组来存储元素。它的优点是可以随机访问,即通过索引来获取元素的时间复杂度为O(1),因为数组的内存是连续的。但是插入和删除元素时,需要移动后续元素的位置,时间复杂度为O(n)。因此,ArrayList适用于查询操作较多、增删操作较少的场景。 LinkedList是基于双向链表的实现,内部使用节点来存储元素,每个节点内保存有当前元素以及指向前后节点的引用。它的优点是在插入和删除元素时,只需要改变相邻节点的指针,时间复杂度为O(1)。但是在查询操作时,需要从头节点开始遍历,直到找到目标节点,时间复杂度为O(n)。因此,LinkedList适用于增删操作较多、查询操作较少的场景。 另外,ArrayList的内存空间是连续的,所以相对于LinkedList,它更加紧凑,不会浪费太多空间。而LinkedList每个节点在内存中是分散存储的,需要额外的指针来指向前后节点,因此它的内存占用更多。同时,由于ArrayList的大小是固定的,所以当元素数量超过容量时,需要扩容,而LinkedList则没有这个限制。 综上所述,ArrayList适用于查询操作更多、数组容量需要动态扩展的场景;而LinkedList适用于频繁增删操作、不需要随机访问的场景。选择使用哪种数据结构要根据具体的需求和场景来决定。 ### 回答3: ArrayListLinkedList都是Java中的集合类,用于存储和操作一组元素。它们的区别主要体现在内部实现方式和性能上。 首先,ArrayList是基于数组实现的动态数组,而LinkedList是基于链表实现的双向链表。这导致它们在许多操作上的性能表现不同。 其次,ArrayList的优势在于随机访问元素的效率高,因为它可以通过索引直接定位元素。而LinkedList的优势在于插入和删除元素的效率高,因为它只需要修改前后元素的指针即可。 另外,ArrayList的缺点是在中间位置插入或删除元素时,需要移动后续元素来保持顺序,因此效率较低。而LinkedList的缺点是随机访问元素的效率较低,需要从头或尾开始遍历链表。 总的来说,如果需要频繁地进行随机访问操作,可以选择ArrayList;如果需要频繁地进行插入和删除操作,可以选择LinkedList。 除了性能差异外,它们的使用方式和功能几乎相同。无论是ArrayList还是LinkedList,都可以通过add、remove、get等方法来操作元素。另外,它们还都实现了List接口,可以使用统一的方式访问和操作集合中的元素。 综上所述,ArrayListLinkedList区别主要在于内部实现方式和性能方面。选择哪种集合类取决于具体的应用场景和需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值