Collection的继承关系如下:
Collection
- 集合层次的根接口,对集合一些常用方法的高度抽象,此接口通常用于需要最大通用性的情况下实现,但是JDK并没有提供此接口的任何直接实现,它提供了更具体的子接口如Set和List实现!
- Collection接口是list和set的顶级接口,其抽象了一些常用的公共方法,实现了Iterable接口,实现该接口以保证子类可以获取集合中元素的迭代器已进行遍历,验证了list和set系列集合是可以使用迭代器遍历的
AbstractCollection
AbstractCollection此抽象类包含一些List和Set的公共实现(实际上还有一些我们不常用的对象也实现它 这里就不管了),通过实现它可以省去部分重复的编码,此外它将iterator和size声明为Abstract让子类来实现
Set
- Set是不包含重复元素的集合(如何做到的?后续写到具体的集合再详细说),Set实现了Collection,它也是一个接口,没有添加任何新的方法,和Collection是一致的
- 为什么一致还要创建Set呢?Collection是Set和List的顶层抽象,而Set接口和List接口分别是set集合和list集合的顶层,通过在Set接口和List接口中添加一些特有的方法可以更好的方便调用者使用集合,比如下面看下List集合它就添加了list的特有方法,而这些List特有方法很明显不适合放在Collection中,因为这违背了迪米特原则
List
-
List是有序集合,实现List接口的集合可以精确控制列表中的每一个元素的插入位置,可以通过索引访问元素
-
允许重复元素
-
List接口提供了一个特殊的迭代器ListIterator,这个不详细说了不知道的百度并发修改异常!通过ListIterator在遍历中允许元素插入和替换
-
List提供了精准的add和remove方法,如下:
void add(int index, E element);
E remove(int index);
通过add方法可以将元素添加到指定位置,通过remove方法可以删除指令位置的元素,从性能的角度来说我们在使用中要谨慎对待这两个方法,原因是不管是添加还是删除,原位置所有的元素都需要前移或后移,举个例子?现在A集合中有1,2,3,4,5个元素,现在add(0,6),往0的位置添加一个数据6那么后续的1,2,3,4,5都需要后移,同样如果remove(0),2,3,4,5都需要前移,数据量大的时候注意
AbstractSet
此抽象类继承了AbstractCollection,实现了Set接口,最大程度减少了直接实现Set接口的工作量,AbstractSet中并没有覆盖AbstractCollection的任何实现,它只是添加了equals和hashCode和removeAll的实现
AbstractList
此抽象类继承了AbstractCollection,实现了List接口,它实现了List中绝大部分函数,底层集合实现该类可以简化更多工作量
ListIterator
List集合特有的迭代器,允许在任意方向上遍历列表,在迭代期间修改元素不会触发fail-fast机制