Java集合容器一览
说到Java容器集合,忍不住要对比下Go。
Java要掌握的语法和API更多,相比来说Go要更简洁。但另一个角度看,Java提供了非常丰富的类和API,这点Go就要弱一些。
比如集合处理,Java的集合容器有着精心的设计,List、Set、Map、Set等等接口、抽象类、实现类。
本文并非要列举每一个集合的特点和使用方式,只是要通过图的形式更直观看下Java集合类,并简单总结下几个集合之间的区别。这里摘了网络上有人总结好的类图,列举出Java的集合容器,和J.U.C下的并发容器。
集合容器
JUC集合容器
java.util.concurrent包提供的容器(Queue、List、Set)、Map,从命名上可以大概区分为Concurrent*、CopyOnWrite和Blocking等三类。
LinkedBlockingQueue 和 ConcurrentLinkedQueue 区别
Concurrent类型基于lock-free(CAS),在常见的多线程访问场景,一般可以提供较高吞吐量。
而LinkedBlockingQueue内部则是基于锁,并提供了BlockingQueue的等待性方法。
Concurrent类型没有类似CopyOnWrite之类容器相对较重的修改开销。
但Concurrent往往提供了较低的遍历一致性。例如,当利用迭代器遍历时,如果容器发生修改,迭代器仍然可以继续进行遍历。
与弱一致性对应的,就是同步容器常见的行为“fail-fast”,也就是检测到容器在遍历过程中发生了修改,则抛出ConcurrentModificationException,不再继续遍历。
弱一致性的另外一个体现是,size等操作准确性是有限的,未必是100%准确。与此同时,读取的性能具有一定的不确定性。