四、ArrayList和LinkedList内部的实现大致是怎样的?


 1、ArrayList集合
     ArrayList是List接口的一个实现类,它是程序中最常见的一种集合。在ArrayList内部封装了一个长度可变的数组对象,当存入的元素超过数组长度时,ArrayList会在内存分配一个更大的数组来存储这些元素,因此ArrayList集合看做一个长度可变的数组。
 2、LinkedList集合
     LinkedList是List接口的另一个实现类。该集合内部维护了一个双向循环链表,链表中的每一个元素都使用引用的方式来记住它的前一个元素和后一个元素。
  
 3、时间复杂度
        //get方法两者之间的对比
        package com.jqka;


        import java.util.LinkedList;  
        import java.util.List;  
        import java.util.Random;  
        import java.util.ArrayList;  
        import java.util.Arrays;  
        import java.util.Collections; 
        public class ListTest{      
            public static final int N=50000;      
            public static List 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;     //随机生成1~100之间的整数      
                    }          
                values=Arrays.asList(vals);//将一个数组转化为一个List对象       
                }      
            static long timeList(List 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;       
                }       
            public static void main(String args[]){           
                System.out.println("ArrayList消耗时间:"+timeList(new ArrayList(values)));          
                System.out.println("LinkedList消耗时间:"+timeList(new LinkedList(values)));       
                }  
            }


    运行结果:
        ArrayList消耗时间:11
        LinkedList消耗时间:3842


        //add方法两者之间的对比
        package com.jqka;


        import java.util.ArrayList;
        import java.util.LinkedList;
        import java.util.List;


        public class ListDemo {       
            static final int N=50000;       
            static long timeList(List 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()));          
                
                System.out.println("LinkedList耗时:"+timeList(new LinkedList()));       }  }
    运行结果:
        ArrayList耗时:189
        LinkedList耗时:4
总结:
      1、ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
      2、由于数组的结构允许程序通过索引的方式来访问元素,因此,对于随机访问get和set,ArrayList优于LinkedList,ArrayList可以随机定位,而LinkedList要移动指针一步一步到节点处。
      3、对于add和remove,LinkedList就比较占优势,只需要对指针进行修改即可,而ArrayList要移动数据来填补被删除的空间。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值