Collections API based on the following flavors:
Notice, that
Remember: An implementation class can be either Ordered or Unordered and Sorted or Unsorted. However Sorted implementation is always Ordered cause sorting itself is a specific type of ordering:
A
An
However, to add elements to the beginning and remove from it's interior require linear-time O(n)
in
The best way to do it at creation time, to prevent accidental unsynchronized access to the list:
It also implements
Prefer
A
In addition to
However
So, prefer using the
Also prefer to use
but cares only about uniqueness - it doesn't allow duplicates.
Bulk operations are particularly well suited to Sets. e.g.
Choose
that maintains doubly-linked list running through all of its elements.
Use
A
Choose
A
which both could be a type of
A
And like a
However it contains the Collection View methods(
which allow a
Use
or to ask for a
The basic operations of
A
So, if u need use it in concurrency take a look on
Or u can synchronize
and like a
Also,
So,
A
,
The simple
Beyond the simple
Interface | Description |
---|---|
List s | Lists of things ordered by index |
Set s | Groups of Unique things (without duplicates) |
Map s | Key-Value entries with unique Keys |
Queue s | Items arranged by the order to be processed (FIFO/LIFO) |
Notice, that
Map
-related collections do not implement java.util.Collection
:
Remember: An implementation class can be either Ordered or Unordered and Sorted or Unsorted. However Sorted implementation is always Ordered cause sorting itself is a specific type of ordering:
Type | Details |
---|---|
Ordered | U can iterate though it in certain predictable order. (List Implementations and
classes that contain prefix Linked are ordered) |
Unordered | Means that iteration order might be random. (HashMap, HashSet, HashTable, etc. are unordered) |
Sorted | Order determined according the sorting rules defined during creation. (classes that contain prefix Tree) are sorted e.g TreeSet, TreeMap |
Unsorted | Items arranged by the insertion-order, but not sorted by certain rules. |
U always should override
U can use only mutually comparable elements in sorted collections. So, those should have the same type & implement
equals()
& hashcode()
methods in elements that are used in collections baked on hashcode, those contain Hash prefix.U can use only mutually comparable elements in sorted collections. So, those should have the same type & implement
Comparable
functional interface.
Or those should be sorted/searched via the using Comparator
.
List Interface
A
List
interface is all about index, it provides such methods like
get(int index), indexOf(Object o), add(int index,Object obj)
, etc.List
implementations are ordered by position that u determine during the invocation
of add/set(int index, E element)
or by adding it to the end.
ArrayList
It's ordered by index, but not sorted collection.An
ArrayList
has dynamic size, so most of the time (except capacity optimization cases) u shouldn't care about it length during creation:)
ArrayList
offers constant-time positional access and it's just plain fast.However, to add elements to the beginning and remove from it's interior require linear-time O(n)
in
ArrayList
.ArrayList
is not synchronized, but if at least one of the threads modifies the list structurally
during concurrent access to it, ArrayList
should be synchronized externally.The best way to do it at creation time, to prevent accidental unsynchronized access to the list:
List list = Collections.synchronizedList(new ArrayList(...));
It also implements
RandomAccess
marker interface,
otherwords u can use it to fast (constant-time) random access.Prefer
ArrayList
over a LinkedList
when u need fast iteration but aren't likely to be doing a lot of insertion & deletion.LinkedList
LikeArrayList
a LinkedList
is unsynchronized & ordered by index position list that permits all elements (including null), except it's not possible to define initial capacity in LinkedList
.A
LinkedList
is the list implementation where the elements are doubly-linked to one another.In addition to
List
interface the LinkedList
class implements Deque
that gives you methods for adding and removing from the beginning or end,
which makes it easy choise for implementing a stack or queue.
A
LinkedList
offers constant-time for the adding/removing the elements from the begging or the end.
However positional access in LinkedList
requires linear-time O(n), that means it iterate more slowly than ArrayList
.
So, choose it when u need frequent insertion/deletion operations.Vector
Think aboutVector
as about synchronized ArrayList
.Vector
is the only class other than ArrayList
to implement
RandomAccess
.However
Vector
is deprecated & has loads of legacy operations!So, prefer using the
ArrayList
with external syncronization instead of Vector
.Also prefer to use
Deque
implementation instead of Stack
class that is a Vector
descendant.Set Interface
Set
it's straightforward interface which contains only methods inherited fromCollection
,but cares only about uniqueness - it doesn't allow duplicates.
Bulk operations are particularly well suited to Sets. e.g.
s1.containsAll(s2), s1.retainAll(s2)
, etc.
Copy one set before calling the appropriate bulk operation to non destruct the original set:
Setintersection = new HashSet (s1); intersection.retainAll(s2)
HashSet
AHashSet
is an unsorted & unordered Set
that permits the null
element.HashSet
is much faster than TreeSet
, it offers constant-time for most operations (add
, remove
,
contains
and size
) but no ordering guarantees.HashSet
uses the inserted object hashcode, so the more efficient your hashcode()
implementation, the faster access you'll get.HashSet
when u need collection with no duplicates and you don't care about the order when iterate through it.LinkedHashSet
ALinkedHashSet
is ordered (keeps insertion-order) HashSet
,that maintains doubly-linked list running through all of its elements.
Use
LinkedHashSet
instead of HashSet
when you need predictable iteration order - it allows u to iterate through the elements in the order they were inserted.A
LinkedHashSet
runs nearly as fast as HashSet
, but iteration time is not affected by capacity(cause it's not possible to tune it like in HashSet
).
When you use either
Otherwise, the default
HashSet
or LinkedHashSet
, the entries must override equals()
and hashCode()
methods!Otherwise, the default
Object.hashCode()
method will allow multiple objects, that u might consider meaningfully equal to be added into
your no-duplicates set.TreeSet
ATreeSet
is implementation of the SortedSet
,
which entries are sorted by natural-order (ascending) or according to sorting rules of Comparator
used at the creation time.Choose
TreeSet
when u need collection of the unique elements sorted by either natural or the specific order.Map Interface
A
Map
allows to map your unique keys (IDs) to the specific values,which both could be a type of
Object
.A
Map
cares about the keys uniqueness.And like a
Set
it's relies on the equals()
method to determine whether two keys are the same or different.Map
s don't implement Collection
interface.keySet
, values
, entrySet
),which allow a
Map
to be viewed as a Collection
.Use
Map
to do things like search for a value based on the key,or to ask for a
Collection
either of just the values, of just the keysHashMap
AHashMap
it's unsynchronized, unsorted, unordered Map
with high performance.
HashMap
unlike Hashtable
allows one null
key and multiple null
values in a collection.Map
(put
, get
, containsKey
, containsValue
, size
, and isEmpty
) behave exactly like their counterparts in Hashtable
.A
HashMap
is mach more faster than HashTable
but not synchronized!So, if u need use it in concurrency take a look on
ConcurrentHashMap
cause HashTable
is slow.Or u can synchronize
HashMap
externally: Collections.synchronizedMap(hashMap);
Hashtable
Hashtable
is like a Vector
synchronized & deprecated interface.Hashtable
doesn't allow neither null
key nor null
values!LinkedHashMap
LinkedHashMap
offers near HashMap
speedand like a
LinkedHashSet
guarantee, that iteration order will be the same as insertion-order.Also,
LinkedHashMap
provides the removeEldestEntry
method which makes it very easy to implement a custom cache via overriding it.TreeMap
Like aTreeSet
implement NavigableSet
which is descendant of SortedSet
,
TreeMap
implements NavigableMap
which is descendant of SortedMap
,therefore it's a sorted either by natural-order or by the rules defined by the used Comparator
.So,
TreeMap
rely on the same principles as TreeSet
, which means your entries should be mutually-comparable.
It consistent with equals, and entries either should implement Comparable
interface or be sorted via using some Comparator
implementation.
TreeMap
& TreeSet
contain a batch of extremely useful methods for elements-polling (retrieving and removing the first/last (highest) element).Queue Interface
A
Queue
is an ordered Collection
designed to hold the elements in order to be processed, that
typically is FIFO (firs-in, first-out).Priority Queue
Unlike the typical basic FIFO/LIFO queues that can be handled byLinkedList
,
PriorityQueue
is supposed to maintain "priority-in, priority-out" queue.PriorityQueue
elements are ordered either by natural-ordering(first elements will be accessed first) or according to Comparator
order represents their relative priority.Deque Interface
The simple
Deque
can be used both as FIFO (first-in, first-out) and LIFO (last-in, first-out).Beyond the simple
Queue
in a Deque
all new elements can be inserted, retrieved and removed at both ends.
LinkedList
implements Deque
interface in addition to List
one.
Very nice article . Thanks for sharing good tutorials. You can see treemap examples on java vogue
ReplyDelete