这篇文章总结了所有的Java集合(Collection)。主要介绍各个集合的特性和用途,以及在不同的集合类型之间转换的方式。
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复制会更快。可以参考这篇文章).
最后,所有的集合都可以用T[] Collection.toArray( T[] a ) 这个方法复制到数组中。通常会用这样的方式调用:
return coll.toArray( new T[ coll.size() ] );这个方法会分配足够大的数组来储存所有的集合,这样 toArray 在返回值时就不必再分配空间了。
这一部分介绍的是不支持多线程的集合。这些集合都在java.util包里。其中一些在Java 1.o的时候就有了(现在已经弃用),其中大多数在Java 1.4中重新发布。枚举集合在Java 1.5中重新发布,并且从这个版本之后所有的集合都支持泛型。PriorityQueue也在Java 1.5中加入。非线程安全的集合架构的最后一个版本是ArrayDeque ,也在Java 1.6中重新发布了。
就像有专门的java.util.Arrays来处理数组,Java中对集合也有java.util.Collections来处理。
第一组方法主要返回集合的各种数据:
Collections.checkedCollection / checkedList / checkedMap / checkedSet / checkedSortedMap / checkedSortedSet:检查要添加的元素的类型并返回结果。任何尝试添加非法类型的变量都会抛出一个ClassCastException异常。这个功能可以防止在运行的时候出错。//fixmeCollections.emptyList / emptyMap / emptySet :返回一个固定的空集合,不能添加任何元素。Collections.singleton / singletonList / singletonMap:返回一个只有一个入口的 set/list/map 集合。Collections.synchronizedCollection / synchronizedList / synchronizedMap / synchronizedSet / synchronizedSortedMap / synchronizedSortedSet:获得集合的线程安全版本(多线程操作时开销低但不高效,而且不支持类似put或update这样的复合操作)Collections.unmodifiableCollection / unmodifiableList / unmodifiableMap / unmodifiableSet / unmodifiableSortedMap / unmodifiableSortedSet:返回一个不可变的集合。当一个不可变对象中包含集合的时候,可以使用此方法。第二组方法中,其中有一些方法因为某些原因没有加入到集合中:
Collections.addAll:添加一些元素或者一个数组的内容到集合中。Collections.binarySearch:和数组的Arrays.binarySearch功能相同。Collections.disjoint:检查两个集合是不是没有相同的元素。Collections.fill:用一个指定的值代替集合中的所有元素。Collections.frequency:集合中有多少元素是和给定元素相同的。Collections.indexOfSubList / lastIndexOfSubList:和String.indexOf(String) / lastIndexOf(String)方法类似——找出给定的List中第一个出现或者最后一个出现的子表。Collections.max / min:找出基于自然顺序或者比较器排序的集合中,最大的或者最小的元素。Collections.replaceAll:将集合中的某一元素替换成另一个元素。Collections.reverse:颠倒排列元素在集合中的顺序。如果你要在排序之后使用这个方法的话,在列表排序时,最好使用Collections.reverseOrder比较器。Collections.rotate:根据给定的距离旋转元素。Collections.shuffle:随机排放List集合中的节点,可以给定你自己的生成器——例如 java.util.Random / java.util.ThreadLocalRandom or java.security.SecureRandom。Collections.sort:将集合按照自然顺序或者给定的顺序排序。Collections.swap:交换集合中两个元素的位置(多数开发者都是自己实现这个操作的)。这一部分将介绍java.util.concurrent包中线程安全的集合。这些集合的主要属性是一个不可分割的必须执行的方法。因为并发的操作,例如add或update或者check再update,都有一次以上的调用,必须同步。因为第一步从集合中组合操作查询到的信息在开始第二步操作时可能变为无效数据。
多数的并发集合是在Java 1.5引入的。ConcurrentSkipListMap / ConcurrentSkipListSet 和 LinkedBlockingDeque是在Java 1.6新加入的。Java 1.7加入了最后的 ConcurrentLinkedDeque 和 LinkedTransferQueue
如果想要了解更多关于Java集合的知识,推荐阅读以下书籍:
Cay S. Horstmann. Core Java Volume I–Fundamentals (9th Edition) (Core Series) :第13章描述了Java集合.Naftalin, Wadler. Java Generics and Collections:书的第2部分(第10章至第17章)专门讨论了Java集合。Goetz, Peierls, Bloch, Bowbeer, Holmes, Lea. Java Concurrency in Practice:最好的Java并发书籍。第5章讨论了Java 1.5引入的并发集合。单线程 并发 Lists ArrayList——基于泛型数组LinkedList——不推荐使用Vector——已废弃(deprecated) CopyOnWriteArrayList——几乎不更新,常用来遍历 Queues / deques ArrayDeque——基于泛型数组Stack——已废弃(deprecated)PriorityQueue——读取操作的内容已排序 ArrayBlockingQueue——带边界的阻塞式队列ConcurrentLinkedDeque / ConcurrentLinkedQueue——无边界的链表队列(CAS)DelayQueue——元素带有延迟的队列LinkedBlockingDeque / LinkedBlockingQueue——链表队列(带锁),可设定是否带边界LinkedTransferQueue——可将元素`transfer`进行w/o存储PriorityBlockingQueue——并发PriorityQueueSynchronousQueue——使用Queue接口进行Exchanger Maps HashMap——通用MapEnumMap——键使用enumHashtable——已废弃(deprecated)IdentityHashMap——键使用==进行比较LinkedHashMap——保持插入顺序TreeMap——键已排序WeakHashMap——适用于缓存(cache) ConcurrentHashMap——通用并发MapConcurrentSkipListMap——已排序的并发Map Sets HashSet——通用setEnumSet——enum SetBitSet——比特或密集的整数SetLinkedHashSet——保持插入顺序TreeSet——排序Set
ConcurrentSkipListSet——排序并发SetCopyOnWriteArraySet——几乎不更新,通常只做遍历
