注:该系列文章总结自JDK1.9源码的文档注释和源码,我对源码的部分中文注释已经同步到Github:https://github.com/Dodozhou/JDK
Java Collections Framework概述
Java集合框架继承图:
Java集合框架由两个顶层接口衍生而出。这两个接口区别如下:
- Collection:保存一维列表,有数组和链表两种形式。
- Map:保存二维键值对,分为有序和无序两种形式。
顶级结构定义了该类型集合的基本操作方法,和需要遵循的规范。
Collection定义的规范
- 所有通用的集合类(Collection子接口的实现类)都必须提供两个标准的构造器,一个是无参,另一个只包含一个Collection类型的参数,用来创建一个包含同样元素的新集合。由于接口不能有构造方法,所以该规范不能强制要求,但都应该遵守。
- 并不是每个子类都要实现所有的方法,当子类执行不支持的操作,需要抛出UnsupportedOperationException。如对不可变集合执行addAll()方法。
- 不同的实现对装入的元素有不同的要求,如有的允许null值,有的不允许。
- 默认的方法实现并不支持同步,每个实现类的同步策略由自己决定。
- 有些方法可能会因为持有自己的引用(self-referential)而导致递归遍历失败,如clone()、equals()、hashCode()、toString()
- 集合框架接口的很多方法都是基于Object.equals()方法,如contains(obj)。但是具体实现可以自由地实施优化,从而避免了equals调用,例如,首先比较两个元素的散列码。更一般地,各种集合框架接口的实现可以自由地利用底层对象方法的指定行为,只要实现者认为合适。
新增加的方法
在JDK1.8中,Collection接口加入了一些新的默认方法,如
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (