• 【深入Java基础】ArrayList、LinkedList和Vector的用法与区别


    Java中的集合类——ArrayList、LinkedList和Vector

    ArrayList:是List接口的大小可变数组的实现,可以不预设长度,根据需要增加长度。当数组长度达到设定值(即使不显示指定长度,也有一个默认的长度),会产生一个新的对象,长度是增加为50%,并把旧数组的元素复制到新数组,这会使得效率比较慢。

    LinkedList:是List接口链表的实现,增加、修改以及删除效率比ArrayList高,但是随机访问效率相对低一些。

    Vector:是线程安全的动态数组,因为需要同步操作,所以效率不如ArrayList高。当需要扩容时,增加的长度为原来的1倍。

    这是这三个类的实现层次:

    一、 基本用法

    ArrayList

     //创建对象
        ArrayList<Integer> al = new ArrayList<>();
        al.add(1);
        al.add(2);
        al.add(3);
        al.add(3);
        al.add(4);
        al.add(2);
        //获取元素
        System.out.println(al.get(0));
        //判断元素是否存在
        System.out.println(al.contains(1));
        //获取元素所在位置
        System.out.println(al.indexOf(1));
        //是否为空
        System.out.println(al.isEmpty());
        //移除指定位置的元素
        System.out.println(al.remove(1));
        //获取元素最后出现的位置
        System.out.println(al.lastIndexOf(3));
        //移除满足条件的元素
        System.out.println(al.removeIf(s -> s%3==0));//lambda表达式
        //遍历元素
        Iterator<Integer> iterable = al.iterator();
        while (iterable.hasNext()){
            System.out.println(iterable.next());
        }
        //排序
        al.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1>o2?1:-1;
            }
        });
        al.forEach(s -> System.out.println(s));
    

    LinkedList

        LinkedList<Integer> ll = new LinkedList<>();
        ll.add(1);
        ll.add(2);
        ll.add(4);
        ll.add(3);
        ll.push(5);//头部插入
        ll.push(0);
        ll.offer(-1);//对于已满队列执行插入操作时返回false而不是抛出异常
        System.out.println(ll.toString());
        //获取第一个元素
        System.out.println("first:"+ll.getFirst());
        //获取最后一个元素
        System.out.println("last:"+ll.getLast());
        //获取队列头部元素并删除,队列为空时删除抛出异常
        System.out.println("pop:"+ll.pop());
        //获取队列头部元素并删除,队列为空时返回null
        System.out.println("poll:"+ll.poll());
        //获取队列头部元素,队列为空时返回null
        System.out.println("peek:"+ll.peek());
        //获取队列头部元素,队列为空时抛出异常
        System.out.println("element:"+ll.element());
    
        System.out.println();
        System.out.println(ll.toString());
    

    Vector

    与ArrayList类似,不过是线程安全的,可以实现同步。

    二、 区别与联系

    • ArrayList和Vector都是对数组的扩展,是可变长的动态数组。在自动扩容时ArrayList扩容原来的50%,Vector扩容为原来的100%。并且ArrayList没有同步,而Vector是线程安全的,所以Vector的效率不如ArrayList。

    • LinkedList是链表的实现(双向链表),不是线程安全的。因为是链表,所以插入、删除等操作比较高效,而随机访问效率不高。

    • 在需要频繁查询大量数据的情况下,用ArrayList或者Vector;而需要频繁修改数据时则用LinkedList。

  • 相关阅读:
    AcWing每日一题--数字三角形
    AcWing每日一题--货仓选址
    Codeforces Round #693
    动态规划--多重背包
    动态规划--完全背包
    动态规划--01背包
    博弈论--SG函数
    博弈论--Nim游戏
    基础数论--容斥定理
    基础数论--卡特兰数
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286742.html
Copyright © 2020-2023  润新知