对比

List接口:有序的、可重复的数据、”动态”数组
(1)ArrayList: 底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
(2)LinkedList: 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
(3)Vector: 底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素

方法

image.png

常用方法:

  • 增:add(E element)
  • 删:remove(int Index)/E remove(E element)
  • 改:set(int Index,E element)
  • 查:get(int Index)
  • 插: **add(int Index,E element)**
  • 长度:size()
  • 遍历:迭代器; for each; 普通循环结构

访问元素:

  1. 按顺序访问:迭代器:
  2. 随机访问:get()、set();

RandomAccess标记接口

  1. 判断集合是否支持随机访问
  • **List list = new LinkedList();**
  • **boolean b = list instanceof RandomAccess;**

ArrayList

1、jdk 7情况下

  • ArrayList list = new ArrayList();—-底层创建了长度是10的Object[]数组
  • 如果此次的添加导致底层elementData数组容量不够,则扩容默认情况下,扩容为原来的容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中。
  • 结论:建议开发中使用带参的构造器: ArrayList List = new ArrayList(int capacity)

2、 jdk 8中的变化:

  • ArrayList List = new ArrayList();—-底层object[] elementData初始化为{}
  • 第一次调用add()时,底层才创建了长度10的数组,数据添加和扩容操作与jdk7无异。

3、总结:
jdk7中的ArrayList的对象的创建类似于单例的饿汉式,而jdk8中的ArrayList的对象的创建类似于单例的模汉式,延迟了数组的创建,节省内存。

LinkedList

1、源码分析
LinkedList list = new LinkedList();内部声明了Node类型的first和last属;默认值为10—-list.add(123);将123封装到Node中,创建了Node对象。其中, Node定义为:体现了LinkedList的双向链表的说法

  1. private static class Node<E> {
  2. E item;
  3. Node<E> next;
  4. Node<E> prev;
  5. Node (Node<E> prev, E element, Node<E> next) {
  6. this.item = element;
  7. this.next = next;
  8. this.prev = prev;
  9. }
  10. }

Vector:线程安全,效率低

2、所有方法都是同步的,多线程访问安全;
3、同步操作耗费大量时间