|
Collections Framework Enhancements
|
This page summarizes enhancements to the collections
framework in version 5 of the JDK.
Three new language features significantly enhance the collections framework:
- Generics - adds compile-time type safety to the collections
framework and eliminates the need to cast when reading elements from
collections.
- Enhanced for loop - eliminates the need for explicit
iterators when interating over collections.
- Autoboxing/unboxing - automatically converts primitives (such as
int) to wrapper classes (such as Integer) when inserting
them into collections, and converts wrapper class instances to primitives when
reading from collections.
Three new collection interfaces are provided:
- Queue - represents
a collection designed for holding elements prior to processing.
Besides basic Collection operations, queues provide
additional insertion, extraction, and inspection operations.
- BlockingQueue
- extends Queue with operations that wait for the queue to become
non-empty when retrieving an element, and that wait for space to become
available in the queue when storing an element. (This interface is part of
the new package java.util.concurrent.)
- ConcurrentMap
- extends Map
with atomic putIfAbsent, remove, and replace
methods. (This interface is part of java.util.concurrent.)
Two new concrete Queue
implementations are provided, one existing List implementation has
been retrofitted to implement Queue, and one abstract Queue
implementation is provided:
- PriorityQueue - an unbounded priority queue backed by a heap.
- ConcurrentLinkedQueue
- an unbounded thread-safe FIFO (first-in first-out) queue backed by linked
nodes. (This class is part of java.util.concurrent.)
- LinkedList -
retrofitted to implement the Queue interface. When accessed via the
Queue interface, LinkedList behaves as a FIFO queue.
- AbstractQueue - a skeletal Queue implementation.
Five new BlockingQueue
implementations are provided, all of which are part of
java.util.concurrent:
One ConcurrentMap implementation is provided:
- ConcurrentHashMap
- a highly concurrent, high-performance ConcurrentMap implementation backed by a hash table. This implementation never blocks when performing retrievals and allows the client to select the concurrency level for updates. It is intended as a drop-in replacement for Hashtable: in addition to implementing ConcurrentMap, it supports all of the "legacy" methods peculiar to Hashtable.
Special-purpose
List and
Set implementations
are provided for use in situations where read operations vastly outnumber
write operations and iteration cannot or should not be synchronized:
- CopyOnWriteArrayList
- a List implementation backed by an array. All mutative operations
(such as add, set, and remove) are implemented by
making a new copy of the array. No synchronization is necessary, even during
iteration, and iterators are guaranteed never to throw
ConcurrentModificationException. This implementation is well-suited
to maintaining event-handler lists (where change is infrequent, and traversal
is frequent and potentially time-consuming).
- CopyOnWriteArraySet
- a Set implementation backed by a copy-on-write array. This
implementation is similar in nature to CopyOnWriteArrayList. Unlike
most Set implementations, the add, remove,
and contains methods require time proportional to the size of the
set. This implementation is well-suited to maintaining event-handler lists
that must prevent duplicates.
Special-purpose
Set and
Map implementations are
provided for use with enums:
- EnumSet
- a high-performance Set implementation backed by a bit-vector. All
elements of each EnumSet instance must be elements of a single enum
type.
- EnumMap
- a high-performance Map implementation backed by an array. All
keys in each EnumMap instance must be elements of a single enum
type.
A new family of wrapper implementations is provided, primarily for use
with generic collections:
-
Collections.checkedInterface
- returns a dynamically typesafe view of the specified collection, which
throws a ClassCastException if a client attempts to add an element of
the wrong type. The generics mechanism in the language provides compile-time
(static) type checking, but it is possible to defeat this mechanism.
Dynamically typesafe views eliminate this possibility entirely.
Three new generic algorithms and one comparator converter were
added to the Collections utility class:
The Arrays utility class has been outfitted with content-based
hashCode
and toString
methods for arrays of all types. These methods complement the existing
equals methods.
Versions of all three methods are provided to operate on nested (or
"multidimensional") arrays:
deepEquals,
deepHashCode, and
deepToString. It is now trivial to print the contents of any array.
The idiom for printing a "flat" array is:
System.out.println(Arrays.toString(a));
The idiom for printing a nested (multidimensional) array is:
System.out.println(Arrays.deepToString(a));
Finally, Boolean
was retrofitted to implement Comparable.