【深入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。

原文地址:https://www.cnblogs.com/cnsec/p/13286742.html