Java集合(一)

集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所以的集合类都位于java.util包下,后来为了处理多线程环境下的并发安全问题,java5还在java.util.concurrent包下提供了一些多线程支持的集合类。

集合的继承关系

collection继承关系图

集合继承关系图

map继承关系图

map继承关系图

Array与Linked

形式为ArrayXXX与LinkedXXX,例如ArrayList/LinkedList,ArrayBlockingQueue/LinkedBlockingQueue,其中Array开头的为顺序结构,Linked开头的为链式结构。

RandomAccess

随机访问类,继承此类的集合支持随机访问,一般底层结果为数组,也即顺序存储,因此支持随机访问。

Queue与Deque

队列与双端队列,普通队列,先进先出,队尾入队,对首出队,双端队列,两端均可入队与出队。

BlockingQueue

阻塞队列,常用于多线程环境,如果入队时队列已满或者出队时队列已空,则会阻塞线程,类似生产者与消费者模型。

DelayQueue

延迟队列,继承了BlockingQueue,只有延迟时间到了之后,才能从队列中获取元素,并且DelayQueue没有大小限制,因此生产者不会阻塞,但是消费者会阻塞。

SynchronousQueue

无缓冲等待队列,没有容量,是一个不存储元素的阻塞队列,会直接将任务交给消费者,必须等队列中的添加元素被消费后才能继续添加新的元素。

Priority

PriorityXXX,例如PriorityQueue与PriorityBlockingQueue,相对正常的队列,Priority队列的元素会带有优先级,出队时会根据元素优先级决定出队顺序。PriorityQueue底层是使用二叉堆实现的,根据需要可以是小根堆或者大根堆。

Concurrent

ConcurrentXXX,例如ConcurrentHashMap等,是Java后来引入的并发包中的集合,多用于多线程场景,解决线程安全问题。

CopyOnWrite

CopyOnWriteXXX,例如CopyOnWriteArrayList与CopyOnWriteArraySet等等,主题思想是写入时复制,当有多个调用者同时去请求一个资源时,当其中一个调用者要对资源进行修改,系统会copy一个副本给该调用者,让其进行修改;而其他调用者所拥有资源并不会由于该调用者对资源的改动而发生改变。简单的理解,就是当我们往CopyOnWrite容器中添加元素时,不直接操作当前容器,而是先将容器进行Copy,然后对Copy出的新容器进行修改,修改后,再将原容器的引用指向新的容器,即完成了整个修改操作。

Sorted

SortedXXX,例如SortedSet与SortedMap等等,这些一般属于排序接口或者抽象类,继承这些对象的集合一般附带顺序。

IdentityHashMap

在比较Key时,HashMap一般会使用equal比较而IdentityHashMap使用==比较,也即HashMap比较的是值是否相等,而IdentityHashMap比较的是引用是否相等。并且IdentityHashMap解决哈希冲突的方法不同于HashMap的链地址法,而是线性探测法。

WeakHashMap

与HashMap类似,区别在于使用弱引用关联map中存储的数据,通过该类实现缓存,在内存紧张的情况下,可以避免强引用占用大量内存。