zoukankan      html  css  js  c++  java
  • Java中ArrayList和LinkedList的异同

    一:ArrayList和LinkedList的大致区别如下:

    1.ArrayList是实现了基于动态数组的数据结构,ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高

    2.LinkedList基于链表的数据结构, 插入、删除元素时效率比较高  故:【插入、删除操作频繁时,可使用LinkedList来提高效率】

                         LinkedList提供对头部和尾部元素进行添加和删除操作的方法,插入/删除第一个和最后一个效率比较高;

    3:ArrayList和LinkedList都是List接口的实现,都存储一组不唯一,有序(插入顺序)的对象, 对元素进行添加、删除等操作[ 即:List的性质]

    4.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 

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

    6:LinkedList比ArrayList更占内存

    eg:(代码示例01)----ArrayList与LinkedLis的数据添加和查找耗时对比

    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    
    public class HFSD {
        static final int N=50000;     //添加5000条数据
          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;
                 }
         static long readList(List list){           //查找数据所需时间
                     long start=System.currentTimeMillis();
                     for(int i=0,j=list.size();i<j;i++){
    
                         }
                     return System.currentTimeMillis()-start;
                 }
    
                 static List addList(List list){
                     Object o = new Object();
                     for(int i=0;i<N;i++) {
                            list.add(0, o);
                         }
                     return list;
                 }
         public static void main(String[] args) {
                    System.out.println("ArrayList添加"+N+"条耗时:"+timeList(new ArrayList()));
                     System.out.println("LinkedList添加"+N+"条耗时:"+timeList(new LinkedList()));
    
                  List list1=addList(new ArrayList<>());
                  List list2=addList(new LinkedList<>());
                    System.out.println("ArrayList查找"+N+"条耗时:"+readList(list1));
                   System.out.println("LinkedList查找"+N+"条耗时:"+readList(list2));
              }

    分别在ArrayList和LinkedList集合中添加5万条数据,测试运行结果如下:

    从以上结果,我i们可以看出 ArrayList更适合读取数据,linkedList更多的时候添加或删除数据。

    ArrayList:内部是使用可増长数组实现的,所以是用get和set方法是花费少数时间的,但是如果插入元素和删除元素,除非插入和删除的位置都在表末尾,否则代码开销会很大,因为里面需要数组的移动。
    LinkedList:是使用双链表实现的,所以get会非常消耗资源,除非位置离头部很近。但是插入和删除元素花费少数时间。

    二:ArrayList和LinkedList的共有方法(即List的方法):

    eg:(代码示例02)----ArrayList代码示例

    package JIhekuangjia006.ArrayList;
    
    /**
     * 小猪类
     */
    public class Pig {
        private String name;
        private String sex;
    
        public Pig(String name,String sex){
            this.name=name;
            this.sex=sex;
        }
        public void setName(String name){
            this.name=name;
        }
        public String getName(){
            return name;
        }
        public void setSex(String sex){
            this.sex=sex;
        }
        public String getSex(){
            return sex;
        }
    }
    package JIhekuangjia006.ArrayList;
    
    import java.util.*;
    
    /**
     * 使用ArrayList集合进行操作数据
     */
    public class Test1 {
        public static void main(String[] args) {
            //1.存储小猪信息
            Pig xiaojia=new Pig("小佳","母");//索引为0
            Pig xiaolong=new Pig("小龙","公");//索引为1
            Pig jiajia=new Pig("佳佳","女");//索引为2
            Pig longlong=new Pig("龙龙","男");//索引为3(与数组相同,从0开始)
    
            //为小猪排序
            List list=new ArrayList();
            //直接将元素添加排序
            list.add(xiaojia);
            list.add(jiajia);
            list.add(xiaolong);
    
            //将龙龙添加到索引为2的位置
            list.add(2,longlong);
    
            //list.add(jiajia);//List 接口存储一组不唯一,有序(插入顺序)的对象
    
            //2.获得小猪的总数
            //通过list.size()方法获取元素的个数
            list.size();
            System.out.println("小猪的总数为"+list.size());
    
            //3.逐条打印小猪信息
            //方法一:for循环与get()方法配合实现遍历
            for(int i=0;i<list.size();i++){
                Pig center=(Pig)list.get(i);//因为list.get()的返回值为Object的类型,所以需要强转为Pig的类型
                System.out.println(center.getName()+","+center.getSex());
            }
    
            //方法二:通过迭代器Iterator实现遍历
    //        Iterator it=list.iterator();
    //        while (it.hasNext()){
    //            Pig center=(Pig)it.next();
    //            System.out.println(center.getName()+","+center.getSex());
    //        }
    
    
            System.out.println("*********************************************************");
            //4.删除小猪信息
            //删除第一只小猪,小佳
            list.remove(0);//与数组下标相对应
            //删除指定小猪,小龙
            list.remove(xiaolong);
            //将剩下的小猪信息进行输出
            System.out.println("删除之后还有"+list.size()+"只小猪,
    分别是:");
            for(int i=0;i<list.size();i++){
                /**
                 * Object get(int index)返回指定索引位置处的元素。取出的元素是Object类型,
                 * 使用前需要进行强制类型转换
                 */
                Pig center=(Pig)list.get(i);//所以需要强转为Pig的类型
    
                System.out.println(center.getName()+","+center.getSex());
            }
    
            System.out.println("*******************************************************");
            //5.判断集合中是否包含指定小猪
            if (list.contains(xiaojia)){//使用list.contains()方法进行判断
                System.out.println("集合中有小佳");
            }else{
                System.out.println("集合中没有小佳");
            }
        }
    }

    测试运行结果如下:

    三:LinkedList的特有方法:

    eg:(代码示例03)----LinkedList代码示例:

    package JIhekuangjia006.LinkedList;
    
    /**
     * 小猪类
     */
    public class Pig {
        private String name;    //昵称
        private String sex;     //性别
    
        public Pig(String name,String sex){
            this.name=name;
            this.sex=sex;
        }
        public void setName(String name){
            this.name=name;
        }
        public String getName(){
            return name;
        }
        public void setSex(String sex){
            this.sex=sex;
        }
        public String getSex(){
            return sex;
        }
    }
    package JIhekuangjia006.LinkedList;
    
    import java.util.Iterator;
    import java.util.LinkedList;
    
    /**
     * 使用LinkedList集合操作数据
     */
    public class Test2 {
        public static void main(String[] args) {
            //1.存储小猪信息
            Pig xiaojia=new Pig("小佳","母");//索引为0
            Pig xiaolong=new Pig("小龙","公");//索引为1
            Pig jiajia=new Pig("佳佳","女");//索引为2
            Pig longlong=new Pig("龙龙","男");//索引为3(与数组相同,从0开始)
    
            //为小猪排序
            LinkedList list=new LinkedList();
            //直接将元素添加排序
            list.add(xiaolong);
            list.add(longlong);
            list.addFirst(jiajia);//将佳佳添加到第一个位置
            list.addLast(xiaojia);//将小龙添加到最后一个位置
    
            //list.add(jiajia);//List 接口存储一组不唯一,有序(插入顺序)的对象
    
            //2.获得小猪的总数
            //通过list.size()方法获取元素的个数
            list.size();
            System.out.println("小猪的总数为"+list.size());
    
            //3.逐条打印小猪的信息
    
            //方法一:通过迭代器Iterator实现遍历
            Iterator it=list.iterator();
            while (it.hasNext()){
                Pig center=(Pig)it.next();
                System.out.println(center.getName()+","+center.getSex());
            }
    
            //方法二:for循环与get()方法配合实现遍历
    //        for(int i=0;i<list.size();i++){
    //            Pig pig=(Pig)list.get(i);
    //            System.out.println(pig.getName()+","+pig.getSex());
    //        }
    
            System.out.println("************************************************");
    
            //4.
            //获取第一只小猪的信息
            Pig center=(Pig)list.getFirst();
            System.out.println("第一条狗狗信息是:"+center.getName()+","+center.getSex());
            //获取最后一只小猪的信息
            Pig center1=(Pig)list.getLast();
            System.out.println("最后一条狗狗信息是:"+center1.getName()+","+center1.getSex());
    
            System.out.println("*****************************************************");
    
            //5.删除第一只小猪和最后一只小猪
            list.removeFirst();
            list.removeLast();
    
            System.out.println("*****************************************************");
    
            //6.输出剩下小猪的信息
            System.out.println("剩下还有"+list.size()+"只小猪,
    分别是:");
            for(int i=0;i<list.size();i++){
                Pig pig=(Pig)list.get(i);
                System.out.println(pig.getName()+","+pig.getSex());
            }
            //7.判断集合中是否存在小佳
            if(list.contains(xiaojia)){
                System.out.println("集合中存在小佳");
            }else{
                System.out.println("集合中不存在小佳");
            }
        }
    }

    测试运行结果如下:

  • 相关阅读:
    使用 requests 维持会话
    使用 requests 发送 POST 请求
    使用 requests 发送 GET 请求
    requests 安装
    使用 urllib 分析 Robots 协议
    使用 urllib 解析 URL 链接
    使用 urllib 处理 HTTP 异常
    使用 urllib 处理 Cookies 信息
    使用 urllib 设置代理服务
    按单生产程序发布
  • 原文地址:https://www.cnblogs.com/liangbaolong/p/12884574.html
Copyright © 2011-2022 走看看