java吧 关注:1,254,535贴子:12,742,463

【ArrayList与LinkedList效率问题】被误导了好长时间

只看楼主收藏回复

ArrayList与LinkedList在添加与删除时谁的效率更高?一直认为在频繁的添加与删除应用中应该使用LinkedList。前几天看了一本书,里面说其实在数据量比较大时添加与删除ArrayList的效率更高。我在自己的机器上跑了一遍,首先在ArrayList与LinkedLis中分别存储10000个数据,然后分别随机的添加与删除1000个数据,发现无论是添加还是删除ArrayList使用的时间都相对较少。
分析:无论是添加还是删除,都需要走两个过程:查找到位置,然后添加或者删除
使用ArrayList时因为是使用的是一块连续的内存,查找的时间可以忽略不计,大家认为ArrayList效率低的原因是每添加一个元素,其后面的元素都要后移一位,而LinkedList只需要修改一下后一个元素的引用即可。而事实时LinkedList在插入之前也需要先查找需要插入的位置,而这个过程是比较费时间的,尽管不需要再将其他元素进行移动,当数据量较大时频繁的删除与添加还是ArrayList效率较高。
说的有点乱,请大神斧正


1楼2015-06-07 11:45回复
    说的很有道理


    IP属地:上海来自Android客户端2楼2015-06-07 11:49
    收起回复
      测试数据量还是不够大,我是这么认为的


      IP属地:内蒙古来自iPhone客户端4楼2015-06-07 11:52
      收起回复
        ArrayList不是线程安全的


        来自Android客户端5楼2015-06-07 12:02
        收起回复
          刚学到ARRAY不懂


          来自Android客户端6楼2015-06-07 12:12
          回复
            有点道理
               ----- 姑娘你不喜欢我 这是病 必须治 


            来自Android客户端8楼2015-06-07 12:37
            回复
              实践就是真理


              IP属地:广西来自Android客户端9楼2015-06-07 12:39
              回复
                没去探究这个问题!
                 ~“若有天,这副卖相腐化于尘土,可有一分半秒值得我去自豪!”


                IP属地:广东来自Android客户端11楼2015-06-07 13:11
                回复
                  ArrayList是异步处理吧


                  来自Android客户端13楼2015-06-07 13:46
                  回复
                    然并卵


                    IP属地:湖北14楼2015-06-07 14:14
                    回复
                      晚上回去试试,和我想的确实不一样了。


                      来自Android客户端15楼2015-06-07 14:23
                      回复
                        超出capacity的那一次插入操作arraylist会很慢
                        大量靠前的插入操作arraylist不可能比linked快。
                        linked确实慢,实际使用中真没什么用。
                        自己手写一个带索引的linkedlist吧,那样最快。


                        IP属地:江苏来自Android客户端16楼2015-06-07 14:23
                        回复
                          arraylist可以通过下标访问指定的元素,而linkedlist只能通过从头开始遍历找到指定元素,你验证里面涉及到很多的查找,就不适合linkedlist了;
                          linkedlist适合于删除特定区域比如头尾,比如栈,都是从尾部删除,当然你会说也可以用arraylist实现,但是有个缺点是如果事先不知道栈的容量呢,你可以调试或者看源码,new Arraylist()默认是取10的容量,如果超过10,总容量变成15,原数组数据拷贝到新数组中,原数组被垃圾回收(如果来1加1,继续增要重复很多次这种操作,效率降低,所以用空间换时间),这样如果数据是11,会浪费掉4的容量,linkedlist就不会有这种问题,有多少数据用多少容量,增加删除都是O(1),非常完美;
                          选什么结构看有什么资源,比如栈如果不在乎多出来的容量,也可以用arraylist,现实中往往没有完美的情况,所以满足最优先资源需求,其他的舍弃


                          IP属地:广东17楼2015-06-07 14:26
                          收起回复
                            有道理,除非用自己写的linkedlist,并且明确知道要删除的东西在什么地方(每次添加删除可以不需要查找),否则LinkedList的速度确实会比较慢。


                            来自Android客户端18楼2015-06-07 14:30
                            回复