Title: Java Collections: Built-in Data Structures for Java
1Java CollectionsBuilt-in Data Structures for
Java
2- If your are not familiar with any of the
following terms - List, Stack, Queue, Tree, Heap, hashtable
- Please review your data structure book or
read chapter 20 of the textbook carefully for
topics related to these terms.
3The Java Collection API
- Interfaces
- Collection (Iterable) ?
- Set ? SortedSet,
- List
- Queue
- Map ? SortedMap
- Iterator ? ListIterator
- Comparator
- Note After JDK5, all of above interfaces (and
their implementations mentioned hereafter )
become generic types and hence are parameterized
by a type variable ltEgt. I.e., Formally they
should be CollectionltEgt, SetltEgt, , etc.
Queue
4Summary of all interfaces in the java Collection
API
- Collection Interfaces The primary means by
which collections are manipulated. - ( IterableltEgt ? ) CollectionltEgt ? SetltEgt, ListltEgt
- A group of objects.
- May or may not be ordered May or may not
contain duplicates. - SetltEgt ? SortedSetltEgt
- The familiar set abstraction.
- No duplicates May or may not be ordered.
- SortedSet ltEgt
- elements automatically sorted, either in their
natural ordering (see the Comparable interface),
or by a Comparator object provided when a
SortedSet instance is created. - ListltEgt
- Ordered collection, also known as a sequence.
- Duplicates permitted Allows positional access.
5- QueueltEgt ? DequeltEgt ? BlockingQueueltEgt
- a First-in/First-out data container. Elements are
appended to the ends of the queue and are removed
from the beginning of the queue. - deque are double-ended queue.
- MapltK,Vgt ?SortedMapltK,Vgt
- A mapping from keys to values.
- Each key can map to at most one value (function).
- SortedMap ltK,Vgt
- A map whose mappings are automatically sorted by
key, either in the keys' natural ordering or by a
comparator provided when a SortedMap instance is
created.
6Infrastructure
- Iterators Similar to the Enumeration
interface, but more powerful, and with improved
method names. - IteratorltEgt ? ListIteratorltEgt
- functionality of the Enumeration interface
next() E hasNext() boolean remove() - supports element removement from the backing
collection. - ListIteratorltEgt
- Iterator for use with lists.
- supports bi-directional iteration, element
replacement, element insertion and index
retrieval. - Ordering
- Comparable ltTgt ( compareTo( T object ) )
- Imparts a natural ordering to classes that
implement it. - The natural ordering may be used to sort a list
or maintain order in a sorted set or map. Many
classes were designed to implement this
interface. - ComparatorltTgt ( compare(T o1, T o2 )
equals(Object obj ) ) - Represents an order relation, which may be used
to sort a list or maintain order in a
sorted set or map. Can override a type's natural
ordering, or order objects of a type that does
not implement the Comparable interface.
7Infrastructure
- Runtime Exceptions
- UnsupportedOperationException
- Thrown by collections if an unsupported optional
operation is called. - ConcurrentModificationException
- Thrown by Iterator and listIterator if the
backing collection is modified unexpectedly while
the iteration is in progress. - Also thrown by sublist views of lists if the
backing list is modified unexpectedly.
8classes of the java collection API
- AbstractCollection (Collection) ?
- AbstractSet (Set) ? TreeSet(SortedSet), HashSet ?
LikedHashSet - AbstractList (List) ?ArrayList,
Vector? Stack, -
AbstractSequentialList ? LinkedList (Deque) - AbstractQueue(Queue) ? PriorityQueue
- AbstractMap (Map) ?
- HashMap, Hashtable
- TreeMap (SortedMap)
- WeakHashMap
- Arrays
- Collections
- Legends 1. superclass (interface) ? subclass
- 2. red interface brown
abstract blue concrete
9General-Purpose Implementation classes
- The primary implementations of the collection
interfaces. - HashSet Hash table implementation of the Set
interface. - TreeSet Red-black tree implementation of the
SortedSet interface. - ArrayList Resizable-array implementation of
the List interface. - (Essentially an unsynchronized Vector.) The
best all-around implementation of the List
interface. - LinkedList Doubly-linked list implementation of
the List interface. - May provide better performance than the ArrayList
implementation if elements are frequently
inserted or deleted within the list. - Useful for queues and double-ended queues
(dequeues). - HashMap Hash table implementation of the Map
interface. - (Essentially an unsynchronized Hashtable that
supports null keys and values.) The best
all-around implementation of the Map
interface. - TreeMap Red-black tree implementation of the
SortedMap interface.
10The java.util.Collection interface
- represents a group of objects, known as its
elements. - no direct implementation
- The primary use pass around collections of
objects where maximum generality is desired. - Ex List l new ArrayList( c ) // c is a
Collection object - or ListltEgt new ArrayListltEgt( c )
- // E any reference Type c
Collectionlt? extends E1gt
11The definition
- public interface Collection ltEgt extends Iterable
ltEgt - // Basic properties
- int size()
- boolean isEmpty()
- boolean contains(Object element) // use
equals() for comparison - boolean equals(Object)
- int hashCode() // new equals() requires new
hashCode() - // basic operations
- boolean add(E e) // Optional return
true if this changed - boolean remove(E e) // Optional use equals()
(not ) -
12The Collection interface definition
- // Bulk Operations
- boolean containsAll(Collection lt?gt c) //
true if c ? this - // the following 4 methods are optional,
returns true if contents changed - boolean addAll(Collectionlt? extends Egt c)
// Optional this this U c - boolean removeAll(Collectionlt?gt c) //
Optional this this - c - boolean retainAll(Collectionlt?gt c) //
Optional this this ?c - void clear() // Optional
this - // transformations
- IteratorltEgt iterator() // collection ?
iterator imple. of Iterable - Object toArray() // collection ?
array - ltTgt T toArray(T a ) // generic
method with type ltTgt, not ltEgt - // if this a gt copy this to a and
return a else gt create a new array b - // of the type T and copy this to b and
return b -
13Why using Iterators instead of Enumerations
- Method names are simpler.
- Iterator allows the caller to remove elements
from the underlying collection. - public interface Iterator ltEgt
- boolean hasNext() // cf
hasMoreElements() - E next() //
cf nextElement() - void remove() // Optional
-
- // a simple Collection filter using iterator that
Enumeration could not help - static ltTgt void filter(CollectionltTgt c)
- for (IteratorltTgt i c.iterator()
i.hasNext() ) - if ( no-good( i.next() ) )
i.remove() // i.next() is removed from c - i.remove() // exception
raised, cannot removed more than once ! -
14Ex ( Use raw type)
- Integer a1 new Integer 1,2,3,4.
- List c Arrays.asList( a1 ) // c 1,2,3,4
- Iterator l c.iterator()
- While( l.hasNext() )
- Integer k (Integer) l.next()
- if ( k .intValue 3) l.remove()
-
- c.println() // c 1,2,4
15Ex (use generic type)
- Integer a1 new Integer 1,2,3,4.
- List ltIntegergt c Arrays.asList( a1 ) // c
1,2,3,4 - Iterator ltIntegergt l c.iterator()
- While( l.hasNext() )
- Integer k (Integer) l.next() // cast not
needed - if ( k .intValue 3) l.remove()
-
- c.println() // c 1,2,4
16Examples of Bulk and array operations for
Collection
- Remove all instances of an element e from a
collection c - c.removeAll(Collections.singleton(e)) // remove
all es in c - c.removeAll(Collections.singleton(null)) //
remove all nulls in c - collections to arrays
- Collection c new LinkedList() // LinkedList
is an imp. of Col. - c .add(a) c.add(b) // c a, b
component type Object - Object ar1 c.toArray() // ok, ar1.length
2 - String ar2 (String) c.toArray() // may
cause runtime - // exception, cannot cast an array of
Object component type - // to String note can pass compilation.
- String ar3 (String) c.toArray(new
String0) // ok! since c.toArray(String) has
String component type.
17Examples of Bulk and array operations for
Collection
- collections to arrays (use generic type)
- Collection c new LinkedListltStringgt()
- c .add(a) c.add(b) // c a, b
component type Object - Object ar1 c.toArray() // ar1.length 2
- String ar2 (String) c.toArray()
- String ar3 (String) c.toArray(new
String0) - // still need
pass a String.
18The Set Interface
- is a Collection that cannot contain duplicate
elements. - models the mathematical set abstraction.
- contains no methods other than those inherited
from Collection. - same signatures but different semantics ( meaning
) - Collection c new LinkedList() Set s new
HashSet() - String o a
- c.add(o) c.add(o) // both return true
c.size() 2 - s.add(o) s.add(o) // 2nd add() returns false
s.size() 1 - It adds the restriction that duplicate elements
are prohibited. - Collection noDups new HashSet(c) // a simple
way to eliminate duplicate from c - Two Set objects are equal if they contain the
same elements. - Two direct implementations
- HashSet TreeSet
19Basic Operations
- A simple program to detect duplicates using set
- import java.util.
- public class FindDups
- public static void main(String args)
- Set s new HashSet() // or use new
TreeSet() - // following code uses Set methods only
- for (String arg args )
- if ( !s.add(arg) ) out.println("Duplicate
detected arg ) - out.printf( s.size() distinct words detected
s ) -
- java FindDups i came i saw i left
- Duplicate detected i
- Duplicate detected i
- 4 distinct words detected came, left, saw,
i
20Bulk Operations for Set objects
- s1.containsAll(s2) returns true if s2 is a subset
of s1. - s1.addAll(s2), s1.retainAll(s2),
s1.removeAll(s2) - s1 s1 U s2, s1 s1 ? s2, s1 s1 s2,
respectively - return true iff s1 is modified.
- For nondestructive operations
- Set union new HashSet(s1) // make a copy of
s1 - union.addAll(s2)
- Set intersection new HashSet(s1) // may also
use TreeSet(s1) - intersection.retainAll(s2)
- Set difference new HashSet(s1)
- difference.removeAll(s2)
21Example
- Show all arguments that occur exactly once and
those that occur more than once. - import java.util. //use generics
- public class FindDups2
- public static void main(String args)
- Set ltStringgt uniques new HashSet
ltStringgt(), - dups new HashSet ltStringgt ()
- for (String arg args )
- if (! uniques.add(arg))
dups.add(arg ) - uniques.removeAll(dups) // Destructive
set-difference - out.println("Unique words "
uniques) - out.println("Duplicate words " dups)
-
22The List Interface
- A List is an ordered Collection(sometimes called
a sequence). - may contain duplicate elements.
- The List interface includes operations for
- Positional Access set/get elements based on
their numerical position in the list. - Search search for a specified object in the list
and return its numerical position. - List Iteration extend Iterator semantics to take
advantage of the list's sequential nature. - Range-view perform arbitrary range operations on
the list. - Three direct implementations
- ArrayList resizable array
- LinkedList doubly linked-list
- Vector synchronized ArrayList.
23The List interface definition
- public interface List ltEgt extends CollectionltEgt
- // Positional Access
- E get(int index) // 0-based
- E set(int index, E e) //
Optional return old value - void add(int index, E e) //
Optional - E remove(int index) // Optional
remove(Object) given in Collection - boolean addAll(int index, Collectionlt? extends
Egt c) // Optional - // Search
- int indexOf(Object o) // the type
of argument is Object! - int lastIndexOf(Object o)
- // Range-view
- ListltEgt subList(int from, int to)
- // Iteration Iterator iterator() given in
Collection - ListIteratorltEgt listIterator(int f ) //
default f 0 return a listIterator with cursor
set to position f
24List in comparison with Older Vector (1.1)
- shorter getter/setter names
- get(int) // elementAt(int) /
- add( int, Object) //
insertElemetnAt(O,i) - Object set(int, Object) // void
setElementAt(Object,int) - Object remove(int) // void
removeElementAt(int) - Note From java1.2 Vector also implements the
List interface. - List concatenation
- list1 list1.addAll(list2) // destructive
- List list3 new arrayList( list1) // or
LinkedList(list1) - list3.addAll(list2) // list3 equals to list1 .
list2 - Two List objects are equal if they contain the
same elements in the same order. - List l1 new LinkedList(l2) // l2 is an
ArrayList - l1.equals(l2) ? true false // returns true, but
l1l2 returns false.
25ListIterator
- public interface ListIteratorltEgt extends
IteratorltEgt - // from Iterator (forward iteration)
- boolean hasNext()
- E next()
- // backward iteration
- boolean hasPrevious()
- E previous()
- int nextIndex() // cursor position
pos of next() object - int previousIndex() // nextIndex()
1 pos of previous() object - //
-1 if cursor 0 - void remove() // Optional
- void set(E e) // Optional
- void add(E e) // Optional
-
26Set and Add operations in ListIterator
- set(E), remove() Replaces/remove the last
element returned by next or previous with the
specified element. - Ex gt either E(1) (if next() is called more
recently than previous()) - or E(2) (otherwise)
- would be replaced
- add(Object o ) Inserts the specified element
into the list, immediately before the current
cursor position. - Ex add(o) gt E(0) E(1) o (cursor) E(2)
E(3) - Backward Iteration
- for(ListIterator i list.listIterator(list.siz
e()) i.hasPrevious() ) processing(
i.previous())
E(0) E(1) E(2)
E(3)
Index 0 1
2 3 4
(cursor)
27Some Examples
- possible implementation of List.indexOf(Object)
- public int indexOf(Object o)
- for (ListIterator i listIterator()
i.hasNext() ) - if (onull ? i.next()null
o.equals(i.next())) - return i.previousIndex() //
or i.nextIndex() -1 - return -1 // Object not found
- replace all occurrences of one specified value
with another - public static void replace(List l, Object val,
Object newVal) - for (ListIterator i l.listIterator()
i.hasNext() ) - if (valnull ? i.next()null
val.equals(i.next())) - i.set(newVal)
28Range-view Operation
- subList(int f, int t), returns a List view of a
portion of this list whose indices range from f,
inclusive, to t, exclusive, f,t). - Ex
- sublist(1,3) E(1),E(2)
- This half-open range mirrors the typical
for-loop - for (int if iltt i) ...
// iterate over the sublist - Change on sublist is reflected on the backing
list - Ex the following idiom removes a range of
elements from a list - list . subList(from, to) . clear()
E(0) E(1) E(2)
E(3)
Index 0 1
2 3 4
(cursor)
29The Map Interface
- A Map is an object that maps keys to values.
- A map cannot contain duplicate keys
- Each key can map to at most one value.
- Three implementations
- HashMap, which stores its entries in a hash
table, is the best-performing implementation. - TreeMap, which stores its entries in a red-black
tree, guarantees the order of iteration. - Hashtable has also been retrofitted to implement
Map. - All implementation must provide two constructors
(like Collections) Assume M is your
implementation - M() // empty map
- M(Maplt? extends K, ? extends Vgt m) // a copy of
map from m
30The Map interface
- public interface MapltK,Vgt // Map does not
extend Collection - // Basic Operations
- // put or replace, return replaced object
- V put(K key, V value) // optional old value
or null returned - V get(K key)
- V remove(Object key)
- boolean containsKey(Object key)
- boolean containsValue(Object value)
- int size()
- boolean isEmpty()
31The Map interface
- // Bulk Operations
- void putAll(Maplt?extends K, ? extends Vgt
t) //optional - void clear() // optional
- // Collection Views
- // backed by the Map, change on either
will be reflected on the other. - public SetltKgt keySet() // cannot
duplicate by definition!! - public CollectionltVgt values() //
can duplicate - public SetltMap.EntryltK,Vgtgt
entrySet() // no equivalent in Dictionary - // nested Interface for entrySet elements
- public interface EntryltK,Vgt
equals(Object) hashCode() - K getKey()
- V getValue()
- V setValue(V value)
32Possible Exceptions thrown by Map methods
- UnsupportedOperationException
- if the method is not supported by this map.
- ClassCastException
- if the class of a key or value in the specified
map prevents it from being stored in this map. - ex m.put(Name, new Integer(2)) // m actually
put (String) value - IllegalArgumentException
- some aspect of a key or value in the specified
map prevents it from being stored in this map. - ex put(Two, 2) // put expect s an Object
value - NullPointerException
- this map does not permit null keys or values,
and the specified key or value is null.
33Basic Operations
- a simple program to generate a frequency table
- import java.util.
- public class Freq private static final
Integer ONE new Integer(1) - public static void main(String args)
- Map m new HashMap() // or
MapltString, Integergt m - // Initialize frequency table from
command line - for (int i0 iltargs.length i)
- Integer freq (Integer)
m.get(argsi) // key is a string - m.put(argsi, (freqnull ? ONE new
Integer( freq.intValue() 1))) - // value is Integer
- System.out.println( m.size()" distinct
words detected") - System.out.println(m)
- gt java Freq if it is to be it is up to me to
delegate - 8 distinct words detected
- to3, me1, delegate1, it2, is2,
if1, be1, up1
34Basic Operations ( after JDK 1.5)
- a simple program to generate a frequency table
- import java.util.
- public class Freq private static final int
ONE 1 - public static void main(String args)
- MapltString, Integergt m new
HashMapltString, Integergt() - // Initialize frequency table from
command line - for (String arg args)
- Integer freq m.get(arg)
- m.put( arg, (freqnull ? ONE freq
1)) // autoBox, autoUnbox used - // value is Integer
- System.out.println( m.size()" distinct
words detected") - System.out.println(m)
- gt java Freq if it is to be it is up to me to
delegate - 8 distinct words detected
- to3, me1, delegate1, it2, is2,
if1, be1, up1
35Bulk Operations
- clear() removes all of the mappings from the
Map. - putAll(Map) operation is the Map analogue of the
Collection interface's addAll() operation. - can be used to create attribute map creation
with default values. Here's a static factory
method demonstrating this technique - static ltK,Vgt MapltK,Vgt newAttributeMap(MapltK,Vgt
defaults, Maplt?extends K, V extends Vgt overrides)
- MapltK,Vgt result new HashMapltK,Vgt
(defaults) - result.putAll(overrides)
- return result
-
36Collection Views methods
- allow a Map to be viewed as a Collection in three
ways - keySet the Set of keys contained in the Map.
- values The Collection of values contained in the
Map. This Collection is not a Set, as multiple
keys can map to the same value. - entrySet The Set of key-value pairs contained in
the Map. - The Map interface provides a small nested
interface called Map.Entry that is the type of
the elements in this Set. - the standard idiom for iterating over the keys in
a Map - for (Iterator i m.keySet().iterator()
i.hasNext() ) - System.out.println(i.next())
- if(no-good()) i.remove() //
support removal from the back Map - Iterating over key-value pairs
- for (Iterator im.entrySet().iterator()
i.hasNext() ) - Map.Entry e (Map.Entry) i.next()
- System.out.println(e.getKey() " "
e.getValue())
37Permutation groups of words
- import java.util. import java.io.
- public class Perm
- public static void main(String args)
- int minGroupSize Integer.parseInt(args1)
- // Read words from file and put into
simulated multimap - MapltString, ListltStringgtgt m new
HashMapltString, ListltStringgt () - try Scanner in new Scanner(new
File(args0)) - while(in.hasNext())
- String word in.nextLine()
// or word in.next() - String alpha
alphabetize(word) - //
normalize word success? ccesssu - List ltStringgt l
m.get(alpha) - if (lnull) m.put(alpha,
lnew ArrayListltStringgt () ) - l.add(word)
- catch(Exception e)
System.err.println(e) System.exit(1)
38- // Print all permutation groups above size
threshold - for (IteratorltListltStringgtgt i
m.values().iterator() i.hasNext() ) - ListltStringgt l (List) i.next()
- if (l.size() gt minGroupSize)
- System.out.println(l.size() " "
l) -
-
39- // buketsort implementation
- private static String alphabetize(String s)
- int count new int256
- int len s.length()
- for (int i0 iltlen i)
- counts.charAt(i)
- StringBuffer result new
StringBuffer(len) - for (char c'a' clt'z' c)
- for (int i0 iltcountc
i) - result.append(c)
- return result.toString()
-
40Some results
- java Perm dictionary.txt 8
- 9 estrin, inerts, insert, inters, niters,
nitres, sinter, triens, trines - 8 carets, cartes, caster, caters, crates,
reacts, recast, traces - 9 capers, crapes, escarp, pacers, parsec,
recaps, scrape, secpar, spacer - 8 ates, east, eats, etas, sate, seat, seta,
teas - 12 apers, apres, asper, pares, parse, pears,
prase, presa, rapes, reaps, spare, spear - 9 anestri, antsier, nastier, ratines, retains,
retinas, retsina, stainer, stearin - 10 least, setal, slate, stale, steal, stela,
taels, tales, teals, tesla - 8 arles, earls, lares, laser, lears, rales,
reals, seral - 8 lapse, leaps, pales, peals, pleas, salep,
sepal, spale - 8 aspers, parses, passer, prases, repass,
spares, sparse, spears - 8 earings, erasing, gainers, reagins, regains,
reginas, searing, seringa - 11 alerts, alters, artels, estral, laster,
ratels, salter, slater, staler, stelar, talers - 9 palest, palets, pastel, petals, plates,
pleats, septal, staple, tepals
41The SortedSet Interface
- A SortedSet is a Set that maintains its elements
in ascending order, sorted according to the
elements' natural order(via comparable
interface), or according to a Comparator provided
at SortedSet creation time. - In addition to the normal Set operations, the
SortedSet interface provides operations for - Range-view Performs arbitrary range operations
on the sorted set. - Endpoints Returns the first or last element in
the sorted set. - Comparator access Returns the Comparator used to
sort the set (if any). - Standard constructors Let S be the
implementation - S( Comparator ) // empty set
- S(SortedSet) // copy set
- Implementation TreeSet
42The SortedSet
- public interface SortedSetltEgt extends SetltEgt
- // Range-view
- SortedSetltEgt subSet(E f, E t) // return f, t
), f.eq(t) -gtnull - SortedSetltEgt headSet(E t) //
first(), t ) - SortedSetltEgt tailSet(E fromElement)// f,
last() - // Endpoints
- E first()
- E last()
- // Comparator access
- Comparatorlt? super Egt comparator() //
return null if natural order is used. -
43The SortedMap Interface
- A SortedMap is a Map that maintains its entries
in ascending order, sorted according to the keys
natural order, or according to a Comparator
provided at SortedMap creation time. - In addition to the normal Map operations, the
SortedMap interface provides operations for - Range-view Performs arbitrary range operations
on the sorted map. - Endpoints Returns the first or last key in the
sorted map. - Comparator access Returns the Comparator used to
sort the map (if any). - Constructors provided by implementations
- M(Comparator) // empty SortedMap
- M(SortedMap) // copy Map
- Implementation TreeMap
44The SortedMap interface
- // analogous to SortedSet
- public interface SortedMapltK,Vgt extends MapltK,Vgt
- Comparatorlt? super Kgt comparator()
- // range-view operations
- SortedMapltK,Vgt subMap(K fromKey, K
toKey) - SortedMapltK,Vgt headMap(K toKey)
- SortedMapltK,Vgt tailMap(K fromKey)
- // member access
- // Dont forget bulk of other Map operations
available - K firstKey()
- K lastKey()
- // throws NoSuchElementException if
m.isEmpty()
45SortedMap Operations
- Operations inheriting from Map behave identically
to normal maps with two exceptions - keySet() entrySet() values() . Iterator()
traverse the collections in key-order. - toArray() contains the keys, values, or entries
in key-order. - Although not guaranteed by the interface,
- the toString() method of SortedMap in all the
JDK's SortedMap returns a string containing all
the elements in key-order.
46Example
- SortedMapltString,Stringgt m new
TreeMapltString,Stringgt() - m.put("Sneezy", "common cold")
- m.put("Sleepy", "narcolepsy")
- m.put("Grumpy", "seasonal affective
disorder") - System.out.println( m.keySet() )
- System.out.println( m.values() )
- System.out.println( m.entrySet() )
- Running this snippet produces this output
- Grumpy, Sleepy, Sneezy
- seasonal affective disorder, narcolepsy, common
cold - Grumpyseasonal affective disorder,
Sleepynarcolepsy, - Sneezycommon cold
47Actual Collection and Map Implementations
- Implementations are the actual data objects used
to store collections (and Maps). - Three kinds of implementations
- General-purpose Implementations
- the public classes that provide the primary
implementations of the core interfaces. - Wrapper Implementations
- used in combination with other implementations
(often the general-purpose implementations) to
provide added functionality. - Convenience Implementations
- Convenience implementations are
mini-implementations, typically made available
via static factory methods that provide
convenient, efficient alternatives to the
general-purpose implementations for special
collections (like singleton sets).
48General Purpose Implementations
Hash Table Resizable array balanced tree linked list
Set HashSet TreeSet (sortedSet)
List ArrayList Vector LinkedList
Map HashMap Hashtable TreeMap (sortedMap)
49Properties of the implementations
- consistent names as well as consistent behavior.
- fully implementations of all the optional
operations. - All permit null elements, keys and values.
- unsynchronized.
- remedy the deficiency of Hashtable and Vector
- can become synchronized through the
synchronization wrappers - All have fail-fast iterators, which detect
illegal concurrent modification during iteration
and fail quickly and cleanly. - All are Serializable,
- all support a public clone() method.
- should be thinking about the interfaces rather
than the implementations. The choice of
implementation affects only performance.
50HashSet vs treeSet (and HashMap vs TreeMap)
- HashSet/ HashMap is much faster (constant time
vs. log time for most operations), but offers no
ordering guarantees. - always use HashSet/HashMap unless you need to use
the operations in the SortedSet, or in-order
iteration. - choose an appropriate initial capacity of your
HashSet if iteration performance is important. - The default initial capacity is 101, and that's
often more than you need. - can be specified using the int constructor.
- Set s new HashSet(17) // set bucket size to 17
51ArrayList vs LinkedList
- Most of the time, you'll probably use ArrayList.
- offers constant time positional access
- Think of ArrayList as Vector without the
synchronization overhead. - Use LikedList If you frequently add elements to
the beginning of the List, or iterate over the
List deleting elements from its interior. - These operations are constant time in a
LinkedList but linear time in an ArrayList.
52Wrapper Implementations
- are implementations that delegate all of their
real work to a specified collection, but add some
extra functionality on top of what this
collection offers. - These implementations are anonymous
- the JDK provides a static factory method.
- All are found in the Collections class which
consists solely of static methods. - Synchronization Wrappers //K,V,E are method type
parameters - public static CollectionltEgt synchronizedCollection
(Collection ltEgt c) - public static SetltEgt synchronizedSet(SetltEgt s)
- public static ListltEgt synchronizedList(List ltEgt
list) - public static MapltK,Vgt synchronizedMap(MapltK,Vgt
m) - public static SortedSetltEgt synchronizedSortedSet(S
ortedSetltEgt s) - public static SortedMapltK,Vgt synchronizedSortedMap
(SortedMap ltK,Vgtm)
53read-only access to Collection/Maps
- Unmodifiable Wrappers
- public static CollectionltEgt unmodifiableCollection
(CollectionltEgt c) - public static SetltEgt unmodifiableSet(SetltEgt s)
- public static ListltEgt unmodifiableList(ListltEgt
list) - public static MapltK,Vgt unmodifiableMap(MapltK,Vgt
m) - public static SortedSetltEgt unmodifiableSortedSet(S
ortedSetltEgt s) - public static SortedMapltK,Vgt unmodifiableSortedMap
( SortedMap ltK,Vgt m)
54Convenience Implementations
- mini-implementations that can be more convenient
and more efficient then the general purpose
implementations - available via static factory methods or exported
constants in class Arrays or Collections. - List-view of an Array
- List l Arrays.asList(new Object100) // list
of 100 nulls. - Immutable Multiple-Copy List
- List l new ArrayList(Collections.nCopies
(1000, new Integer(1))) - Immutable Singleton Set
- c.removeAll(Collections.singleton(e))
- profession.values().removeAll(Collections.singleto
n(LAWYER)) - (Immutable) Empty Set and Empty List Constants
- Collections.EMPTY_SET Collections.EMPTY_LIST
- Collections.EMPTY_MAP // add(1) ?
UnsupportedOp Exception
55Convenience Implementations
- (Immutable) Empty Set and Empty List methods
- ltEgt SetltEgt emptySet()
- ltEgt ListltEgt emptyList()
- ltK,Vgt MapltK,Vgt emptyMap()
56The Arrays class
- static List asList(Object a) // a could not
be of the type int, - Returns a fixed-size list backed by the specified
array. cannot add/remove() - static int binarySearch(Type a, Type key)
- Searches the specified array of bytes for the
specified value using the binary search
algorithm. Type can be any primitive type or
Object. - static boolean equals(Type a1, Type a2)
- static void fill(Type a ,int f, int t, Type
val) - Assigns the specified val to each element of the
specified array of Type. - static void sort(Type a , int f, int t)
- Sorts the specified range of the specified array
into ascending numerical order. - static sort(Object a, Comparator c ,int f,
int t ) - Sorts the specified array of objects according
to the order induced by the specified
comparator.
57The Collections class
- static int binarySearch(List list, Object key ,
Comparator c) - static void copy(List dest, List src) //
foreach i d.set(i, s.get(i)) - static Enumeration enumeration(Collection c)
- Returns an enumeration over the specified
collection. - static void fill(List list, Object o)
- static Object max(Collection coll , Comparator
comp ) - static Object min(Collection coll , Comparator
comp ) - static List nCopies(int n, Object o)
- static void reverse(List l)
- static Set singleton(Object o)
- static Comparator reverseOrder() // assume
a is of type String - // usage Arrays.sort(a, Collections.reverseOrde
r()) - static void shuffle(List list , Random rnd)
- static void swap(List, int, int)
- static void rotate(List, int d) // obj at i
moved to ( i - d mod size())
58The implementation of reverseOrder()
- public static Comparator reverseOrder()
- return REVERSE_ORDER
-
- private static final Comparator REVERSE_ORDER
new ReverseComparator() - private static class ReverseComparator
implements Comparator,Serializable - public int compare(Object o1, Object o2)
- Comparable c1 (Comparable)o1
- Comparable c2 (Comparable)o2
- return -c1.compareTo(c2)
-
-
59The Collections class
- static List singletonList(Object
o) - static Map singletonMap(Object
key, Object value) - static void sort(List list,
Comparator c) - static Collection synchronizedCollection(Colle
ction c) - static Collection unmodifiableCollection(Colle
ction c) - static List EMPTY_LIST //The empty list
(immutable). - static Map EMPTY_MAP //The empty map
(immutable). - static Set EMPTY_SET //The empty set
(immutable).