跳至主要內容

Java集合类型详解


Java集合类型详解

这篇文章总结了所有的Java集合(Collection)。主要介绍各个集合的特性和用途,以及在不同的集合类型之间转换的方式。

1. Arrays

Array是Java特有的数组。在你知道所要处理数据元素个数的情况下非常好用。java.util.Arrays 包含了许多处理数据的实用方法:

方法声明功能描述
Arrays.asList()可以从 Array 转换成 List。可以作为其他集合类型构造器的参数
Arrays.binarySearch()在一个已排序的或者其中一段中快速查找
Arrays.copyOf()如果你想扩大数组容量又不想改变它的内容的时候可以使用这个方法
Arrays.copyOfRange()可以复制整个数组或其中的一部分
Arrays.deepEquals()
Arrays.deepHashCode()
Arrays.equals/hashCode的高级版本,支持子数组的操作
Arrays.equals()如果你想要比较两个数组是否相等,应该调用这个方法而不是数组对象中的 equals方法(数组对象中没有重写equals()方法,所以这个方法之比较引用而不比较内容)。这个方法集合了Java 5的自动装箱和无参变量的特性,来实现将一个变量快速地传给 equals()方法——所以这个方法在比较了对象的类型之后是直接传值进去比较的
Arrays.fill()用一个给定的值填充整个数组或其中的一部分
Arrays.hashCode()用来根据数组的内容计算其哈希值(数组对象的hashCode()不可用)。这个方法集合了Java 5的自动装箱和无参变量的特性,来实现将一个变量快速地传给 Arrays.hashcode方法——只是传值进去,不是对象
Arrays.sort()对整个数组或者数组的一部分进行排序。也可以使用此方法用给定的比较器对对象数组进行排序
Arrays.toString()打印数组的内容

如果想要复制整个数组或其中一部分到另一个数组,可以调用 System.arraycopy()方法。此方法从源数组中指定的位置复制指定个数的元素到目标数组里。这无疑是一个简便的方法。(有时候用 ByteBuffer bulk复制会更快。可以参考这篇文章open in new window).

最后,所有的集合都可以用T[] Collection.toArray( T[] a ) 这个方法复制到数组中。通常会用这样的方式调用:

return coll.toArray( new T[ coll.size() ] );

这个方法会分配足够大的数组来储存所有的集合,这样 toArray() 在返回值时就不必再分配空间了。

2. 单线程集合

这一部分介绍的是不支持多线程的集合。这些集合都在java.util包里。其中一些在Java 1.o的时候就有了(现在已经弃用),其中大多数在Java 1.4中重新发布。枚举集合在Java 1.5中重新发布,并且从这个版本之后所有的集合都支持泛型。PriorityQueue也在Java 1.5中加入。非线程安全的集合架构的最后一个版本是ArrayDeque ,也在Java 1.6中重新发布了。

2.1 List

2.2 Queues/Deques

2.3 Maps

2.4 Sets

3. java.util.Collections

就像有专门的java.util.Arrays来处理数组,Java中对集合也有java.util.Collections来处理。

第一组方法主要返回集合的各种数据:

第二组方法中,其中有一些方法因为某些原因没有加入到集合中:

4. 并发集合

这一部分将介绍java.util.concurrent包中线程安全的集合。这些集合的主要属性是一个不可分割的必须执行的方法。因为并发的操作,例如addupdate或者checkupdate,都有一次以上的调用,必须同步。因为第一步从集合中组合操作查询到的信息在开始第二步操作时可能变为无效数据。

多数的并发集合是在Java 1.5引入的。ConcurrentSkipListMap / ConcurrentSkipListSetLinkedBlockingDeque是在Java 1.6新加入的。Java 1.7加入了最后的 ConcurrentLinkedDequeLinkedTransferQueue

4.1 Lists

4.2 Queues/Deques

4.3 Maps

4.4 Sets

5. 相关阅读

6. 推荐阅读

如果想要了解更多关于Java集合的知识,推荐阅读以下书籍:

7. 总结

集合单线程并发
ListsArrayList——基于泛型数
LinkedList——不推荐使用
Vector——已废弃(deprecated)
CopyOnWriteArrayList——几乎不更新,常用来遍历
Queues/DequesArrayDeque——基于泛型数组Stack——已废弃(deprecated)
PriorityQueue——读取操作的内容已排序
ArrayBlockingQueue——带边界的阻塞式队列
ConcurrentLinkedDeque / ConcurrentLinkedQueue——无边界的链表队列(CAS)
DelayQueue——元素带有延迟的队列
LinkedBlockingDeque / LinkedBlockingQueue——链表队列(带锁),可设定是否带边界
LinkedTransferQueue——可将元素transfer进行w/o存储
PriorityBlockingQueue——并发PriorityQueue
SynchronousQueue——使用Queue接口进行Exchanger
MapsHashMap——通用Map
EnumMap——键使用enum
Hashtable——已废弃(deprecated)
IdentityHashMap——键使用==进行比较
LinkedHashMap——保持插入顺序
TreeMap——键已排序
WeakHashMap——适用于缓存(cache)
ConcurrentHashMap——通用并发Map
ConcurrentSkipListMap——已排序的并发Map
SetsHashSet——通用set
EnumSet——enum Set
BitSet——比特或密集的整数Set
LinkedHashSet——保持插入顺序
TreeSet——排序Set
ConcurrentSkipListSet——排序并发Set
CopyOnWriteArraySet——几乎不更新,通常只做遍历