Java collections framework

The Java collections framework is a set of classes and interfaces that implement commonly reusable collection data structures.

Although referred to as a framework, it works in a manner of a library. The collections framework provides both interfaces that define various collections and classes that implement them.

Differences from Arrays
s and arrays are similar in that they both hold references to objects and they can be managed as a group. However, unlike arrays, s do not need to be assigned a certain capacity when instantiated. s can grow and shrink in size automatically when objects are added or removed.

s cannot hold primitive data types such as,  , or. Instead, s can hold wrapper classes such as, , or.

s are generic and hence invariant, but arrays are covariant. This can be considered an advantage of generic objects such as Collection when compared to arrays, because under circumstances, using the generic Collection instead of an array prevents run time exceptions by instead throwing a compile-time exception to inform the developer to fix the code. For example, if a developer declares an Object[] object, and assigns the Object[] object to the value returned by a new Long[] instance with a certain capacity, no compile-time exception will be thrown. If the developer attempts to add a String to this Long[] object, the java program will throw an ArrayStoreException. On the other hand, if the developer instead declared a new instance of a Collection as ArrayList, the Java compiler will (correctly) throw a compile-time exception to indicate that the code is written with incompatible and incorrect type, thus preventing any potential run-time exceptions.The developer can fix the code by instantianting Collection as an ArrayList object. If the code is using Java SE7 or later versions, the developer can instatiate Collection as an ArrayList<> object by using the diamond operator

s are generic and hence reified, but arrays are not reified.

History
implementations in pre-JDK 1.2 versions of the Java platform included few data structure classes, but did not contain a collections framework. The standard methods for grouping Java objects were via the array, the, and the   classes, which unfortunately were not easy to extend, and did not implement a standard member interface.

To address the need for reusable collection data structures, several independent frameworks were developed, the most used being Doug Lea's Collections package, and ObjectSpace Generic Collection Library (JGL), whose main goal was consistency with the C++ Standard Template Library (STL).

The collections framework was designed and developed primarily by Joshua Bloch, and was introduced in JDK 1.2. It reused many ideas and classes from Doug Lea's Collections package, which was deprecated as a result. Sun Microsystems chose not to use the ideas of JGL, because they wanted a compact framework, and consistency with C++ was not one of their goals.

Doug Lea later developed a concurrency package, comprising new Collection-related classes. An updated version of these concurrency utilities was included in JDK 5.0 as of JSR 166.

Architecture
Almost all collections in Java are derived from the  interface. defines the basic parts of all collections.

The interface has the and  methods for adding to and removing from a   respectively. It also has the method, which converts the   into an array of  s in the   (with return type of  ). Finally, the method checks if a specified element exists in the.

The  interface is a subinterface of , so any   may be the target of a for-each statement. (The  interface provides the  method used by for-each statements.) All  s have an  that goes through all of the elements in the.

is generic. Any  can store any Object. For example, any implementation of Collection contains String objects. No casting is required when using the String objects from an implementation of. Note that the angled brackets < > can hold a type argument that specifies which type the  holds.

Types of collection
There are several generic types of : Queues, maps, lists and sets.

Queues allow the programmer to insert items in a certain order and retrieve those items in the same order. An example is a waiting list. The base interfaces for queues are called.

Dictionaries/Maps store references to objects with a lookup key to access the object's values. One example of a key is an identification card. The base interface for dictionaries/maps is called.

Lists are finite collections where it can store the same value multiple times.

Sets are unordered collections that can be iterated and contain each element at most once. The base interface for sets is called.

List interface
Lists are implemented in the collections framework via the interface. It defines a list as essentially a more flexible version of an array. Elements have a specific order, and duplicate elements are allowed. Elements can be placed in a specific position. They can also be searched for within the list.

List implementations
There are several concrete classes that implement, including  and all of its corresponding subclasses, as well as.

AbstractList class
The direct subclasses of class include,  and.

is an example of a skeletal implementation, which leverages and combines the advantages of interfaces and abstract classes by making it easy for the developer to develop their own implementation for the given interface.

ArrayList class
The  class implements the  as an array. Whenever functions specific to a  are required, the class moves the elements around within the array in order to do it.

LinkedList class
The  class stores the elements in nodes that each have a pointer to the previous and next nodes in the. The  can be traversed by following the pointers, and elements can be added or removed simply by changing the pointers around to place the node in its proper place.

Vector class
The class has  as its direct subclass. This is an example of a violation of the composition over inheritance principle in the Java platform libraries, since in computer science, a vector is generally not a stack. Composition would have been more appropriate in this scenario.

Stack class
The Stack class  class  with five operations that allow a   to be treated as a. Stacks are created using . The  offers methods to put a new object on the   (method ) and to get objects from the   (method ). A  returns the object according to last-in-first-out (LIFO), e.g. the object which was placed latest on the   is returned first. is a standard implementation of a stack provided by Java.

The  class represents a last-in-first-out (LIFO) stack of objects. The Stack class has five additional operations that allow a  to be treated as a. The usual and  operations are provided, as well as a method  to peek at the top item on the , a method to test for whether the   is empty , and a method to search the   for an item and discover how far it is from the top. When a  is first created, it contains no items.

CopyOnWriteArrayList class
The CopyOnWriteArrayList extends the Object class, and does not extend any other classes. CopyOnWriteArrayList allows for thread-safety without performing excessive synchronization.

In some scenarios, synchronization is mandatory. For example, if a method modifies a static field, and the method must be called by multiple threads, then synchronization is mandatory and concurrency utilities such as CopyOnWriteArrayList should not be used.

However synchronization can incur a performance overhead. For scenarios where synchronization is not mandatory, then the CopyOnWriteArrayList is a viable, thread-safe alternative to synchronization that leverages multi-core processors and results in higher CPU utilization.

Queue interfaces
The  interface defines the queue data structure, which stores elements in the order in which they are inserted. New additions go to the end of the line, and elements are removed from the front. It creates a first-in first-out system. This interface is implemented by, ', and '.

AbstractQueue class
The direct subclasses of class include, , , , . and .

Note that and  both extend  but do not extend any other abstract classes such as.

is an example of a skeletal implementation.

PriorityQueue class
The  class implements , but also alters it. has an additional method. Instead of elements being ordered in the order in which they are inserted, they are ordered by priority. The method used to determine priority is either the method in the elements, or a method given in the constructor. The class creates this by using a heap to keep the items sorted.

ConcurrentLinkedQueue class
The  class extends. implements the interface.

The  class is a thread-safe collection, since for any an element placed inside a, the Java Collection Library guarantees that the element is safely published by allowing any thread to get the element from the collection. An object is said to be safely published if the object's state is made visible to all other thread at the same point in time. Safe publication usually requires synchronization of the publishing and consuming threads.

BlockingQueue interface
The  interface extends.

The interface has the following direct sub-interfaces:  and. works like a regular, but additions to and removals from the   are blocking. If is called on an empty , it can be set to wait either a specified time or indefinitely for an item to appear in the. Similarly, adding an item using the method is subject to an optional capacity restriction on the , and the method can wait for space to become available in the   before returning. interface introduces a method which removes and gets the head of the , and waits until the   is no longer empty if required.

Double-ended queue (Deque) interfaces
The interface extends the interface. creates a double-ended queue. While a regular only allows insertions at the rear and removals at the front, the  allows insertions or removals to take place both at the front and the back. A is like a  that can be used forwards or backwards, or both at once. Additionally, both a forwards and a backwards iterator can be generated. The interface is implemented by   and.

LinkedList class
, of course, also implements the  interface and can also be used as one. But it also has the  methods. implements the  interface, giving it more flexibility.

ArrayDeque class
implements the  as an array. Similar to,   also implements the  interface.

BlockingDeque interface
The  interface extends. is similar to. It provides the same methods for insertion and removal with time limits for waiting for the insertion or removal to become possible. However, the interface also provides the flexibility of a. Insertions and removals can take place at both ends. The blocking function is combined with the  function.

Set interfaces
Java's interface defines the. A  can't have any duplicate elements in it. Additionally, the  has no set order. As such, elements can't be found by index. is implemented by ', ', and .

Set interface implementations
There are several implementations of the Set interface, including and its subclasses, and the final static inner class  (where  and  are formal type parameters).

AbstractSet
is a skeletal implementation for the interface.

Direct subclasses of include, , ,  and.

EnumSet class
The class extends. The class has no public constructors, and only contain static factory methods.

contains the static factory method. This method is an aggregation method. It takes in several parameters, takes into account of the type of the parameters, then returns an instance with the appropriate type. As of 2018, In Java SE8 OpenJDK implementation uses two implementations of which are invisible to the client, which are  and. If the no longer provided any performance benefits for small enum types, it could be removed from the library without negatively impacting the Java Collection Library.

is a good replacement for the bit fields, which is a type of set, as described below.

Traditionally, whenever developers encountered elements of an enumerated type that needs to be placed in a set, the developer would use the int enum pattern in which every constant is assigned a different power of 2. This bit representation enables the developer to use the bitwise OR operation, so that the constants can be combined into a set, also known as a bit field. This bit field representation enables the developer to make efficient set-based operations and bitwise arithmetic such as intersection and unions.

However, there are many problems with bit field representation approach. A bit field is less readable than an int enum constant. Also, if the elements are represented by bit fields, it is impossible to iterate through all of these elements.

A recommended alternative approach is to use an, where an int enum is used instead of a bit field. This approach uses an to represent the set of values that belong to the same  type. Since the implements the  interface and no longer requires the use of bit-wise operations, this approach is more type-safe. Furthermore, there are many static factories that allow for object instantiation, such as the method method.

After the introduction of the, the bit field representation approach is considered to be obsolete.

HashSet class
uses a hash table. More specifically, it uses a  to store the hashes and elements and to prevent duplicates.

LinkedHashSet class
The  class extends  by creating a doubly linked list that links all of the elements by their insertion order. This ensures that the iteration order over the  is predictable.

CopyOnWriteArraySet class
CopyOnWriteArraySet is a concurrent replacement for a synchronized. It provides improved concurrency in many situations by removing the need to perform synchronization or making a copy of the object during iteration, similar to how CopyOnWriteArrayList acts as the concurrent replacement for a synchronized. On the other hand, similar to CopyOnWriteArrayList, CopyOnWriteArraySet should not be used when synchronization is mandatory.

SortedSet interface
The  interface extends the   interface. Unlike a regular, the elements in a   are sorted, either by the element's  method, or a method provided to the constructor of the. The first and last elements of the  can be retrieved using the  and  methods respectively, and subsets can be created via minimum and maximum values, as well as beginning or ending at the beginning or ending of the. The  class implements the   interface.

NavigableSet interface
The  interface extends the  interface and has a few additional methods. The, , , and methods find an element in the set that's close to the parameter. Additionally, a descending iterator over the items in the  is provided. As with,   implements.

TreeSet class
uses a red–black tree implemented by a . The red–black tree ensures that there are no duplicates. Additionally, it allows  to implement .

ConcurrentSkipListSet class
ConcurrentSkipListSet acts as a concurrent replacement for implementations of a synchronized. For example it replaces a that has been wrapped by the  method.

Map interfaces
Maps are defined by the  interface in Java.

Map interface implementations
Maps are data structures that associate a key with an element. This lets the map be very flexible. If the key is the hash code of the element, the  is essentially a. If it's just an increasing number, it becomes a list.

Examples of implementations include ', ', and .

AbstractMap class
is an example of a skeletal implementation.

The direct subclasses of class include, , , ,  and.

EnumMap
extends. has comparable speed with an ordinal-indexed array. This is because internally uses an array, with implementation details completely hidden from the developer. Hence, the EnumMap gets the type safety of a while the performance advantages of an array.

HashMap
uses a hash table. The hashes of the keys are used to find the elements in various buckets. The is a hash-based collection.

LinkedHashMap
extends by creating a doubly linked list between the elements, allowing them to be accessed in the order in which they were inserted into the map. contains a    method which is called by the   method whenever a new key is added to the. The  removes its eldest entry whenever   returns true. The  method can be overridden.

TreeMap
, in contrast to and, uses a red–black tree. The keys are used as the values for the nodes in the tree, and the nodes point to the elements in the.

ConcurrentHashMap
is similar to and is also a hash-based collection. However, there are a number of differences, such as the differences in the locking strategy they use.

The uses a completely different locking strategy to provide improved scalability and concurrency. does not synchronize every method using the same lock. Instead, use a mechanism known as lock striping. This mechanism provides a finer-grained locking mechanism. It also permits a higher degree of shared access.

ConcurrentSkipListMap class
ConcurrentSkipListMap acts as a concurrent replacement for implementations of a synchronized. ConcurrentSkipListMap is very similar to ConcurrentSkipListSet, since ConcurrentSkipListMap replaces a that has been wrapped by the  method.

SortedMap interface
The  interface extends the  interface. This interface defines a  that's sorted by the keys provided. Using, once again, the  method or a method provided in the constructor to the , the key-element pairs are sorted by the keys. The first and last keys in the  can be called by using the  and  methods respectively. Additionally, submaps can be created from minimum and maximum keys by using the method. is implemented by.

NavigableMap interface
The  interface extends  in various ways. Methods can be called that find the key or map entry that's closest to the given key in either direction. The map can also be reversed, and an iterator in reverse order can be generated from it. It's implemented by.

ConcurrentMap interface
The  interface extends the  interface. This interface a thread Safe interface, introduced as of Java programming language's Java Collections Framework version 1.5.

Extensions to the Java collections framework
Java collections framework is extended by the Apache Commons Collections library, which adds collection types such as a bag and bidirectional map, as well as utilities for creating unions and intersections.

Google has released its own collections libraries as part of the guava libraries.