zoukankan      html  css  js  c++  java
  • Java Vector ArrayList LinkedList介绍及区别

    1 区别与联系

    1.1 Vector ArrayList

    Vector ArrayList 都是继承与 List 的 Java 集合类。他们非常相识,是 List 的不同实现。

    1. 线程安全方面,Vector 是线程安全的,ArrayList 是不安全的.
    2. 访问速度上,因为 Vector 是线程(Thread)同步(Synchronized)的,所以访问效率要比 ArrayList 慢。

    1.2 ArrayList LinkedList

    1. ArrayList 查询快,复制、删除、移动慢,当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
    2. LinkedList使用双向链表实现存储,存储空间不需要连续空间,增加、删除、移动快而查询则慢。

    2 介绍

    2.1 ArrayList

    ArrayList可以理解为长度可变的数组Array,JVM为其分配连续的内存空间,ArrayList可以进行动态的扩容,默认初始化容量为10(默认空的构造函数new ArrayList()),也可以new ArrayList(int initialCapacity)自定义初始化容量。

    boolean add()

    1. 向 ArrayList 尾部增加一个元素
    2. 首先判断当前 ArrayList 的容量,通过 if (minCapacity - elementData.length > 0) 来判断
    3. 如果容量足够则新增,如果不够则使用 grow() 方法进行扩容,新的容量增加原来的一半。并且每进行一次扩容就会有一次数据的拷贝。

    void add(int index, E element)

    添加一个元素到指定的位置。

    1. 判断当前 ArrayList 容量是否够用,不够则需要扩容。

    E get(int index)

    返回list指定位置的数据元素.

    为了保证 ArrayList 的操作效率,一般来讲,最好在初始化的时候设定他的大小,否则在实际操作过程中,遇到需要扩容的,则需要对数组进行复制等操作,比较耗费实际。

    2.2 Vector

    Vector 是 List 接口的一个多线程安全实现类,其结构与 ArrayList 非常相似,同样是一个线性的动态可扩容数组,不过其扩容机制与 ArrayList 有一定的差别

    boolean add(E e) / void addElement(E obj)

    两个方法都是向 Vector 尾部添加一个元素,先进行扩容校验,然后把元素添加到末尾。

    E get(int index)

    获取指定元素

    Vector相关的方法基本都添加了synchronized关键字,从而保证了多线程下的线程安全性,但是在单线程下,Vector却与ArrayList的性能有一定的差距。

    LinkedList

    LinkedList 同样实现了 List 接口,因此其实现了List接口里面的所有方法。实际上,LinkedList 是基于双向链表来实现的,因此其拥有链表具有的增加和删除元素的效率高的优点,这一点基本上和顺序表为结构基础的 ArrayList 和 Vector 集合相对立。

    boolean add(E e) / void add(int index, E element)

    向 LinkedList 尾部增加元素

    public boolean add(E e) {
        linkLast(e); //将元素e链接到链表末尾
        return true;
    }
    
    void linkLast(E e) {
        final Node<E> l = last; //临时保存末尾节点
        final Node<E> newNode = new Node<>(l, e, null); //构造元素值为e的新节点
        last = newNode; //新节点为尾节点
        if (l == null)
            first = newNode;
        else
            l.next = newNode; //.next连接
        size++; //容量+1
        modCount++; //修改数标志+1
    }
    

    LinkedList 实现了 Deque 和 List 接口,因此也实现了 addFirst(E e) / addLast(E e) / offerFirst(E e) / offerLast(E e) / removeFirst() / removeLast() / pollFirst() / pollLast() / peekFirst() / peekLast()等方法

  • 相关阅读:
    tcp/ip协议
    linux系统优化项
    MySQL索引
    mysql命令中的group by 和 order by li'mit使用与技巧
    mysql命令
    WPF学习笔记01_XAML之简介
    【高精度】大整数的因子
    【高精度】计算2的N次方
    【高精度】大整数减法
    【高精度】大整数加法
  • 原文地址:https://www.cnblogs.com/fishpro/p/java-vector-arraylist-linkedlist.html
Copyright © 2011-2022 走看看