• 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("集合中不存在小佳");
            }
        }
    }

    测试运行结果如下:

  • 相关阅读:
    border-radius的8个属性值_画半圆、叶子等
    CSS的background简写方式(转)
    frameset左右栏锚点定位实例
    HTML5新增
    安装MSI报2503的错误
    当前标识(IIS APPPOOLDefaultWebSite)没有对“C:WindowsMicrosoft.NETFramework64v2.0.50727Temporary ASP.NET Files”的写访问权限 解决方案
    Windows设置相关性AFFINITY,修改使用核心数
    Yaml格式文件处理
    Vs2017离线安装包制作
    Vs2017常用快捷键
  • 原文地址:https://www.cnblogs.com/liangbaolong/p/12884574.html
Copyright © 2020-2023  润新知