java.util.Collection java集合框架总结

Collection

写在前面

什么是集合,顾名思义,就是存放多个对象的。
那么,自然就需要往里添加对象add方法,删除对象remove方法,获取共有多少个对象size方法,等等...
Collection(java.util.Collection)是一个接口,定义了这些方法,定义了集合规范,下图展示了所有Collection的方法:
QQ20180920-154401

一、Collection

Collection的子接口有List Set Queue,他们各自都有一个抽象实现类AbstractCollection、AbstractList、AbstractSet、AbstractQueue,而AbstractList、AbstractSet、AbstractQueue同时又是继承AbstractCollection的。这些抽象类实现了Collection、List、Set、Queue接口的部分方法。

二、List

List接口的最终实现由ArrayList、LinkedList、Vector,其中:

1.ArrayList

ArrayList继承了AbstractList,实现了List接口,内部是一个数组,非线程安全

2.Vector

Vector只是把ArrayList的方法前加了个synchronized,线程安全

3.LinkedList

LinkedList继承了AbstractSequentialList,AbstractSequentialList了继承AbstractList,实现了List接口,内部是一个链表。另外,LinkedList也实现了Deque接口,意味着它也是个双向队列,这个就跟下面的Queue接口有交叉了。
可以注意到,ArrayList核Vector都实现了RandomAccess接口,这个接口只是个标记,比如标记ArrayList和Vector可以通过下标快速get到元素,因为他们是通过数组实现的,这样在使用算法时可以针对数据采用更快的算法,而不是跟LinkedList一样的算法。

三、Queue

最终实现由ArrayDeque、LinkedList、PriorityQueue

1.ArrayDeque

ArrayDeque是数组实现的双线队列,它先实现了Deque接口,而Deque接口又实现了Queue接口,非线程安全

2.LinkedList

LinkedList既是一个List又是一个Deque,非线程安全

3.PriorityQueue

与ArrayDequeue不同,PriorityQueue仅仅继承了AbstractQueue,并没有显式的实现Queue接口,但是AbstractQueue是实现Queue接口的,PriorityQueue继承了它,也就同时实现了Queue接口,只不过没有显式的再实现一次,不知为何,ArrayList要多此一举,继承了AbstractList又实现List接口,命名AbstractList已经实现过了。
PriorityQueue非线程安全,使用线程安全的java.util.concurrent.PriorityBlockingQueue

四、Set

最终实现类HashSet、LinkedHashSet、TreeSet、EnumSet(很少用,忽略)

1.HashSet

HashSet实现了Set接口,实际上是一个HashMap(仅用到看key,value会用一个Dummy的Object),HashSet每次迭代时的顺序可能会不一样,允许null,HashSet的所有方法都是直接调用HashMap,没额外处理,没什么可说的,理解了HashMap就明白了。
非线程安全

2.LinkedHashSet

LinkedHashSet继承了HashSet,重写了构造方法,在构造方法中创建HashMap时使用LinkedHashMap而不是HashMap。
非线程安全

3.TreeSet

先看两个接口

SortedSet接口

SortedSet接口,字面上理解可排序的集合,实现了该接口的集合在进行迭代时可以排序,顺序按照自然排序或按照在创建集合指定的比较器排序。
需要注意,插入到SortedSet集合中的元素必须实现Comparable接口或能被指定的比较器比较(不能抛出ClassCastException),否则在使用这样的集合时可能会抛出ClassCastException。
因为可以排序,所有SortedSet接口比Set接口多了一些比如first()、last()、subSet之类的方法。
同SortedSet对应的有SortedMap

NavigableSet接口,是对SortedSet的进一步完善及扩充。
对于一个支持排序的集合(实现了SortedSet接口)来说,可以获取第一个first()、最后一个last()等时很常见的需求,但是慢慢的我们发现这些还不够,比如我想获取小于某个元素的所有元素,SortedSet里没有直接的方法,虽然可以用subSet(e,last())实现,在比如我想在subSet时指定包含或不包含边界元素,这个SortedSet是无法实现的,综合这些需求才出现了NavigableSet接口,里边有lower(E)、floor(E)、descendingSet(返回一个颠倒顺序的心集合)等方法。
同NavigableSet对应的有NavigableMap

TreeSet

那么TreeSet就是以上SortedSet、NavigableSet接口的实现了。
TreeSet是靠TreeMap实现的,跟HashSet类似
非线程安全

(全文完)

(转载本站文章请注明作者和出处 java.util.Collection java集合框架总结