ArrayList和LinkedList详解

ArrayList

  • ArrayList底层是用数组实现的存储。

  • 特点:查询效率高,增删效率低,线程不安全。使用频率很高。

  • 通过无参构造方法的方式ArrayList()初始化,则赋值底层数Object[] elementData为一个默认空数组Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}所以数组容量为0,只有真正对数据进行添加add时,才分配默认DEFAULT_CAPACITY = 10的初始容量。

  • 扩容
    1.第一步他会重新定义一个长度为之前数组长度1.5倍的数组
    2.然后把原数组的数据,原封不动的复制到新数组中,这个时候再把指向原数的地址换到新数组,ArrayList就这样完成了一次改头换面。

  • 实现接口

实现了RandomAccess接口,可以随机访问
实现了Cloneable接口,可以克隆
实现了Serializable接口,可以序列化、反序列化
实现了List接口,是List的实现类之一
实现了Collection接口,是Java Collections Framework成员之一
实现了Iterable接口,可以使用for-each迭代

LinkedList

  • LinkedList 是基于链表实现的,除了 LIst 接口之外,LinkedList 还实现了 Deque,Cloneable,Serializable 三个接口。这说明该数据结构支持队列,克隆和序列化操作的。与 ArrayList 一样,允许 null 元素的存在,且是不支持多线程的。
  • LinkedList 提供了以下三个成员变量。size,first,last。
 transient int size = 0;
 transient Node<E> first;
 transient Node<E> last;

其中 size 为 LinkedList 的大小,first 和 last 分别为链表的头结点和尾节点。Node 为节点对象。

private static class Node<E> {
    
    
    E item;
    Node<E> next;
    Node<E> prev;
    Node(Node<E> prev, E element, Node<E> next) {
    
    
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}

Node 是 LInkedList 的内部类,定义了存储的数据元素,前一个节点和后一个节点,典型的双链表结构。

猜你喜欢

转载自blog.csdn.net/AIJXB/article/details/115137269