List

  • ArrayList
  • Vector和Stack
  • LinkedList
  • SynchronizedList

ArrayList的细节

1.ArrayList基于数组实现,访问元素效率快,插入删除元素效率慢

transient Object[] elementData;

  • ArrayList内部维护一个数组elementData,用于保存列表元素

2.ArrayList支持快速随机访问

  • ArrayList实现RandomAccess接口(快速随机访问的标记)
  • 通常情况下(当List实现RandomAccess或小于一定阀值(private static final int BINARYSEARCH_THRESHOLD = 5000;)时,使用索引二分查找算法),使用索引访问的效率比使用迭代器访问的效率快
    Collections.binarySearch(list,"key")list.indexOf("key")list.lastIndexOf("key")访问效率快

3.大多数情况下,我们都应该指定ArrayList的初始容量

/** * Default initial capacity. */ private static final int DEFAULT_CAPACITY = 10;

  • ArrayList扩容机制:每次扩容至少为原来容量大小的1.5倍,其默认容量的是10,当不指定初始容量使用默认构造函数来创建实例,在执行add
    操作时,就会扩容到默认容量10

Vector和Stack

1.Vector基于数组实现,支持快速访问,线程安全

  • Vector在每个方法都加了同步锁,线程安全但效率低于ArrayList,在需要同步的情况下使用SynchronizedList

2.Vector的扩容机制不完善

  • 如果容量大小和扩容大小都不指定,开始可能会频繁地进行扩容
  • 如果指定容量大小但不指定扩容大小,将以2倍的大小进行扩容会浪费资源
  • 如果指定容量大小和扩容大小,会按照扩容大小进行扩容,扩容大小的取值总有不理想的时候

3.Stack继承Vector扩展了栈的方法

  • 进栈push,出栈pop

LinkedList

1.LinkedList基于链表实现,插入删除元素效率快,访问元素效率慢

  • LinkedList内部维护一个双端链表,插入元素只需新建一个node,再把前后指针指向对应的前后元素即可,删除元素只需剪掉节点,再把前后节点连接起来

2.LinkedList可以当作队列和栈使用

  • 进队offerFirst,出队pollLast
  • 进栈push,出栈pop

SynchronizedList

1.SynchronizedList继承于SynchronizedCollection,使用装饰者模式,为原来的List加上锁实现List同步安全

你可能感兴趣的:(List)