【Java集合框架】Collection

List接口实现类(能添加多个null值)

线程不安全的Collection和Map都能用Collections.synchronizedXXX()使其成为同步容器(线程安全)。

ArrayList

  • ArrayList底层维护一个Object数组,如果不指定初始容量的话会先创建一个空数组,在第一次add()的时候将容量扩容为10。扩容、删除等操作大多是使用System.arraycopy。
  • add()、remove()、clear()时会将modCount++,在迭代器中遍历时会检查迭代器中的expectedModCount是否与modCount相等。如果不使用迭代器的add、remove方法则会造成两个值不相等,那么就会抛出异常:ConcurrentModificationException。即ArrayList的迭代器支持fail-fast
  • 每次添加元素时会计算是否需要扩容,每次扩容为原来数组的1.5倍。

LinkedList

  • 底层用链表实现,而且现了Deque接口,可以用来做双端队列或者栈。
  • add默认使用尾插法,但也可以用addFirst或addLast指定头插还是尾插(因为是双端队列)。
  • 与ArrayList相同,也有modCount和expectedModCount,支持fail-fast

Vector

  • 线程安全版的ArrayList,为每个方法都加了synchronized修饰。
  • 默认初始容量也是10,在构造方法中可以指定初始容量和每次扩容时的增量,如果不指定增量则每次扩容为原来的2倍。

Stack

  • Stack继承自Vector,所以也是线程安全的,是一个后进先出的栈。
  • push和pop 入栈出栈,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

Iterator接口和ListIterator接口

  • Iterator用于遍历集合中的元素。
  • ListIterator继承自Iterator,ListIterator增加了向前迭代的功能(Iterator只能向后迭代),ListIterator还可以通过add()方法向List集合中添加元素(Iterator只能删除元素)。

Queue接口实现类(不能添加null值,否则报空指针异常)

ArrayDeque(不能添加null)

  • 类似于LinkedList,只不过底层不是链表而是数组,用两个int值head和tail代表队列头和尾的下标。
  • 容量小于64就扩容为原来的2倍,否则扩容为原来的1.5倍。
  • 支持fail-fast

PriorityQueue(不能添加null)

  • 底层是一个Object数组,是一个最小堆,可以传入自定义的Comparator。

  • 默认容量11,扩容方式同ArrayDeque。

  • 有modCount和expectedModCount,支持fail-fast

Set接口实现类

HashSet

  • 底层使用了HashMap,将存入Set中的值作为key,以一个无用的object对象作为value。add()本质上调用的是HashMap的put()方法,remove()调用的是HashMap的remove()方法。
  • 不保证元素顺序,可以添加null值,因为底层是向HashMap中添加元素。
  • 因为HashMap的迭代器支持fail-fast,所以HashSet也支持fail-fast。

LinkedHashSet

  • 继承自HashSet,底层使用了LinkedHashMap。
  • 使用双向链表保存元素的插入顺序,内部使用head和tail分别指向最先插入和最后插入的元素。
  • 可以添加null值,底层调用LinkedHashMap的put()方法,而LinkedHashMap继承自HashMap且没有重写HashMap的put()方法,所以本质上还是向HashMap中添加元素,所以LinkedHashSet也支持fail-fast

TreeSet(不能添加null)

  • 底层使用TreeMap红黑树。可以传入Comparator自定义排序。
  • TreeMap不允许添加
  • TreeMap支持fail-fast,因此TreeSet也支持fail-fast。

参考:

Java集合框架详解(全)

相关文章: