Ordering
Random
Access
Key-Value
Pairs
Allows
Duplicates
Allows Null
Values
Thread Safe
YES
YES
NO
YES
YES
NO
NO
NO
HashMap
NO
YES
YES
NO
YES
NO
NO
NO
Vector
YES
YES
NO
YES
YES
YES
NO
NO
Hashtable
NO
YES
YES
NO
NO
YES
NO
NO
ArrayList
Blocking
Upper
Operations
Bounds
Most Commonly Known Collections
Usage Scenarios
* 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)
* Default choice of Map implementation
* Majorly used for simple in-memory caching purpose.
* Historical implementation of List
* A good choice for thread-safe implementation
* Similar to HashMap
* Do not allow null values or keys
* Entire map is locked for thread safety
Most Talked About Collections
* To store bunch of things
* A very nice alternative for ArrayList if
** Do not want repetitions
** Ordering does not matter
HashSet
NO
YES
NO
NO
YES
NO
NO
NO
TreeSet
YES
YES
NO
NO
NO
NO
NO
NO
LinkedList
YES
NO
NO
YES
YES
NO
NO
NO
ArrayDeque
YES
YES
NO
YES
NO
NO
NO
NO
Stack
YES
NO
NO
YES
YES
YES
NO
NO
TreeMap
YES
YES
YES
NO
NO
NO
NO
NO
Special Purpose Collections
WeakHashMap
NO
YES
YES
NO
YES
NO
NO
NO
* 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
Arrays
YES
YES
NO
YES
YES
NO
NO
YES
* A Utility class provided to manipulate arrays
** Searching
** Sorting
** Converting to other Collection types such as a List
Properties
NO
YES
YES
NO
NO
YES
NO
NO
* 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
* To store bunch of things in sorted order
* A very nice alternative for ArrayList if
** Do not want repetitions
** Sorted order
* 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)
* 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
* Similar to a Vector
* Last-In-First-Out implementation
* A very nice alternative for HashMap if sorted keys are important
Thread Safe Collections
CopyOnWriteArrayList
YES
YES
NO
YES
YES
YES
NO
NO
* A thread safe variant of ArrayList
* Best use for
** Small lists which are read intensive
** requires thread-safety
ConcurrentHashMap
NO
YES
YES
NO
NO
YES
NO
NO
* A thread safe variant of Hashtable
* Best use for
** requires thread-safety
** Better performance at high load due to a better locking mechanism
ConcurrentSkipListMap
YES
YES
YES
NO
NO
YES
NO
NO
* A thread safe variant of TreeMap
* Best use for
** requires thread-safety
ConcurrentSkipListSet
YES
NO
NO
NO
NO
YES
NO
NO
* A thread safe variant of TreeSet
* Best use for
** Do not want repetitions
** Sorted order
** Requires thread-safety
CopyOnWriteArraySet
YES
YES
NO
NO
YES
YES
NO
NO
* A thread-safe implementation of a Set
* Best use for
** Small lists which are read intensive
** requires thread-safety
** Do not want repetitions
ConcurrentLinkedQueue
YES
NO
NO
YES
NO
YES
NO
NO
* A thread-safe variant of PriorityQueue
* Best use for
** Small lists
** No random access
** requires thread-safety
ConcurrentLinkedDeque
YES
NO
NO
YES
NO
YES
NO
NO
"* 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
ArrayBlockingQueue
YES
NO
NO
YES
NO
YES
YES
YES
LinkedBlockingQueue
YES
NO
NO
YES
NO
YES
YES
YES
LinkedTransferQueue
YES
NO
NO
YES
NO
YES
YES
YES
PriorityBlockingQueue
YES
NO
NO
YES
NO
YES
LinkedBlockingDeque
YES
NO
NO
YES
NO
YES
SynchronousQueue
YES
NO
NO
YES
NO
YES
DelayQueue
YES
NO
NO
YES
NO
YES
Source:
* 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
* Best use for Producer - Consumer type of scenarios with
** Large capacity bound
** Unpredictable capacity
* Upper bound is optional
* Can be used in situations where the producers should wait for consumer
to receive elements. e.g. Message Passing
"* Best use for Producer - Consumer type of scenarios with
** Large capacity bound
** Unpredictable capacity
** Consumer needs elements in sorted order
* A Deque implementation of LinkedBlockingQueue
YES
YES
** Can add elements at both head and tail
* Both producer and consumer threads will have to wait for a handoff to
occur.
YES
NO
* If there is no consumer waiting. The element is not added to the
collection.
* Similar to a normal LinkedBlockingQueue
* Elements are implementations of Delayed interface
YES
NO
* Consumer will be able to get the element only when it's delay has
expired
http://www.janeve.me/articles/which-java-collection-to-use
YES
NO