linkedList和ArrayList的比较

本文详细对比了ArrayList与LinkedList这两种Java集合类的性能特点。通过具体示例,展示了它们在不同场景下的表现,如随机访问、插入及删除操作等。

       首先上面试题的答案

     1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
     2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

     3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。


     下面有个例子的比较

     public class ListCompare {
    public static final int N=50000;   
      
    public static List<Integer> values;   
 
    static{   
        Integer vals[]=new Integer[N];   
 
        Random r=new Random();   
 
        for(int i=0,currval=0;i<N;i++){   
            vals[i]=new Integer(currval);   
            currval+=r.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("***错误***");   
        }   
        return System.currentTimeMillis()-start;   
    }
    static long timeList1(List<Object> list){   
        long start=System.currentTimeMillis();   
        Object o = new Object();   
        for(int i=0;i<N;i++){
            list.add(0, o);  
        }
          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)));
         
         System.out.println("当执行查询元素操作时,arrayList远远超过likedList的效率");
         
         System.out.println("ArrayList耗时:"+timeList1(new ArrayList<Object>()));   
         System.out.println("LinkedList耗时:"+timeList1(new LinkedList<Object>()));  
         
         System.out.println("当执行添加元素操作时,likedList超过arrayList的效率");

    }


   总结

   ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下:
1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。


2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。


3.LinkedList不支持高效的随机元素访问。


4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间


可以这样说:当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。


    

### 优点对比 #### ArrayList 的优点 - **支持随机访问**:`ArrayList` 基于动态数组实现,支持通过索引快速访问任意元素,时间复杂度为 O(1)[^4]。 - **内存占用较小**:由于 `ArrayList` 使用连续的内存块存储数据,不需要额外存储指针信息,因此在内存占用上更加高效[^4]。 - **尾部操作高效**:在 `ArrayList` 的尾部进行插入或删除操作时,时间复杂度为 O(1)(无需扩容的情况下),效率较高[^4]。 #### LinkedList 的优点 - **高效的插入删除操作**:`LinkedList` 基于双向链表实现,在插入或删除元素时,仅需修改相关节点的指针,时间复杂度为 O(1)(已知插入/删除位置的情况下)。 - **无需扩容**:由于 `LinkedList` 是按需动态添加节点,因此不需要像 `ArrayList` 那样进行扩容操作,避免了扩容带来的性能开销[^4]。 - **灵活的内存分配**:`LinkedList` 不要求连续的内存空间,因此在内存碎片较多的情况下,仍能有效利用内存。 ### 示例代码 以下代码展示了 `ArrayList` `LinkedList` 的基本操作: ```java import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class ListExample { public static void main(String[] args) { // 使用 ArrayList List<String> arrayList = new ArrayList<>(); arrayList.add("Apple"); arrayList.add("Banana"); arrayList.add("Cherry"); System.out.println("ArrayList: " + arrayList); // 使用 LinkedList List<String> linkedList = new LinkedList<>(); linkedList.add("Date"); linkedList.add("Elderberry"); linkedList.add("Fig"); System.out.println("LinkedList: " + linkedList); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值