.

OrderingRandom AccessKey-Value PairsAllows DuplicatesAllows Null ValuesThread SafeBlocking OperationsUpper BoundsUsage Scenarios

.

Most Commonly Known Collections

.

ArrayListYESYESNOYESYESNONONO* Default choice of List implementation
* To store a bunch of things
* Repetitions matters
* Insertion order matters
* Best implementation in case of huge lists which are read intensive (elements are accessed more frequently than inserted deleted)

.

HashMapNOYESYESNOYESNONONO* Default choice of Map implementation
* Majorly used for simple in-memory caching purpose.

.

VectorYESYESNOYESYESYESNONO* Historical implementation of List
* A good choice for thread-safe implementation

.

HashtableNOYESYESNONOYESNONO* Similar to HashMap
* Do not allow null values or keys
* Entire map is locked for thread safety

.

Most Talked About Collections

.

HashSetNOYESNONOYESNONONO* To store bunch of things
* A very nice alternative for ArrayList if
** Do not want repetitions
** Ordering does not matter

.

TreeSetYESYESNONONONONONO* To store bunch of things in sorted order
* A very nice alternative for ArrayList if
** Do not want repetitions
** Sorted order

.

LinkedListYESNONOYESYESNONONO* Sequential Access
* Faster adding and deleting of elements
* Slightly more memory than ArrayList
* Add/Remove elements from both ends of the queue
* Best alternative in case of huge lists which are more write intensive (elements added / deleted are more frequent than reading elements)

.

ArrayDequeYESYESNOYESNONONONO* Random Access
* Faster searching and retrieval of elements
* Add/Remove elements from both ends of the queue
* Best alternative in case of huge lists which are more read intensive

.

StackYESNONOYESYESYESNONO* Similar to a Vector
* Last-In-First-Out implementation

.

TreeMapYESYESYESNONONONONO* A very nice alternative for HashMap if sorted keys are important

.

Special Purpose Collections

.

WeakHashMapNOYESYESNOYESNONONO* The keys that are not referenced will automatically become eligible for garbage collection
* Usually used for advanced caching techniques to store huge data and want to conserve memory

.

ArraysYESYESNOYESYESNONOYES* A Utility class provided to manipulate arrays
** Searching
** Sorting
** Converting to other Collection types such as a List

.

PropertiesNOYESYESNONOYESNONO* Properties are exactly same as the Hashtable
* Keys and Values are String
* Can be loaded from a input stream
* Usually used to store application properties and configurations

.

Thread Safe Collections

.

CopyOnWriteArrayListYESYESNOYESYESYESNONO* A thread safe variant of ArrayList
* Best use for
** Small lists which are read intensive
** requires thread-safety

.

ConcurrentHashMapNOYESYESNONOYESNONO* A thread safe variant of Hashtable
* Best use for
** requires thread-safety
** Better performance at high load due to a better locking mechanism

.

ConcurrentSkipListMapYESYESYESNONOYESNONO* A thread safe variant of TreeMap
* Best use for
** requires thread-safety

.

ConcurrentSkipListSetYESNONONONOYESNONO* A thread safe variant of TreeSet
* Best use for
** Do not want repetitions
** Sorted order
** Requires thread-safety

.

CopyOnWriteArraySetYESYESNONOYESYESNONO* A thread-safe implementation of a Set
* Best use for
** Small lists which are read intensive
** requires thread-safety
** Do not want repetitions

.

ConcurrentLinkedQueueYESNONOYESNOYESNONO* A thread-safe variant of PriorityQueue
* Best use for
** Small lists
** No random access
** requires thread-safety

.

ConcurrentLinkedDequeYESNONOYESNOYESNONO"* A thread-safe variant of LinkedList
* Best use for
** Small lists
** No random access
** Insertions, retrieval on both sides of the queue
** requires thread-safety"

.

Blocking Collections

.

ArrayBlockingQueueYESNONOYESNOYESYESYES* Best use for Producer - Consumer type of scenarios with
** Lower capacity bound
** Predictable capacity
* Has a bounded buffer. Space would be allocated during object creation

.

LinkedBlockingQueueYESNONOYESNOYESYESYES* Best use for Producer - Consumer type of scenarios with
** Large capacity bound
** Unpredictable capacity
* Upper bound is optional

.

LinkedTransferQueueYESNONOYESNOYESYESYES* Can be used in situations where the producers should wait for consumer to receive elements. e.g. Message Passing

.

PriorityBlockingQueueYESNONOYESNOYESYESNO"* Best use for Producer - Consumer type of scenarios with
** Large capacity bound
** Unpredictable capacity
** Consumer needs elements in sorted order

.

LinkedBlockingDequeYESNONOYESNOYESYESYES* A Deque implementation of LinkedBlockingQueue
** Can add elements at both head and tail

.

SynchronousQueueYESNONOYESNOYESYESNO* Both producer and consumer threads will have to wait for a handoff to occur.
* If there is no consumer waiting. The element is not added to the collection.

.

DelayQueueYESNONOYESNOYESYESNO* Similar to a normal LinkedBlockingQueue
* Elements are implementations of Delayed interface
* Consumer will be able to get the element only when it's delay has expired

.

Source: http://www.janeve.me/articles/which-java-collection-to-use