The Java Collection Framework provides interfaces and implementations for commonly used data structures like lists, sets, maps and queues. Some key interfaces include Collection, Set, List, Map and SortedSet. Common implementations are ArrayList, LinkedList, HashSet, TreeSet, HashMap and TreeMap. The framework also includes iterators for traversing collections and algorithms for sorting. Generic types were introduced in Java 5 for type-safe collections.
Introduction to Java Collection Framework with version information; Highlights interfaces, implementations, and algorithms in Java 5.
Discussion of collection interfaces including Collection, Set, List, and Map with their methods and functionalities. Definition and construction of Collections, supported methods, and a code example showcasing use of LinkedList and TreeSet.
Explanation of the Map interface, its methods, and an example demonstrating the use of HashMap.
Introduction to generics in collections from Java 5, promoting safer and more understandable code.
Description of List characteristics, methods, and performance differences between ArrayList and LinkedList.
Definition of Queue and its implementations, including demonstration of LinkedList and PriorityQueue functionality.
Overview of Set interface, uniqueness constraints, equals(), and hashCode() contracts.
Description of SortedSet properties, implementations like TreeSet and ordering behaviors.
Overview of Maps and SortedMaps, their properties, implementations, and usage examples with HashMap.
Discussion on the Iterator interface, iteration methods, and examples for collections and maps.
Discussion on safe modification of collections during iteration using Iterator's remove and ListIterator.
Introduction to Comparable and Comparator interfaces for defining natural and custom ordering for collections.
Overview of algorithms available in Java Collections like sort, binarySearch, and their usage for lists and arrays.
6
Collection
Group ofelements (references to objects)
It is not specified whether they are
Ordered / not ordered
Duplicated / not duplicated
Following constructors are common to all
classes implementing Collection
T()
T(Collection c)
8
Collection example
Collection<Person> persons=
new LinkedList<Person>();
persons.add( new Person(“Alice”) );
System.out.println( persons.size() );
Collection<Person> copy =
new TreeSet<Person>();
copy.addAll(persons);//new TreeSet(persons)
Person[] array = copy.toArray();
System.out.println( array[0] );
9.
9
Map
An objectthat associates keys to values
(e.g., SSN ⇒ Person)
Keys and values must be objects
Keys must be unique
Only one value per key
Following constructors are common to all
collection implementers
T()
T(Map m)
11
Map example
Map<String,Person> people=
new HashMap<String,Person>();
people.put( “ALCSMT”, //ssn
new Person(“Alice”, “Smith”) );
people.put( “RBTGRN”, //ssn
new Person(“Robert”, “Green”) );
Person bob = people.get(“RBTGRN”);
if( bob == null )
System.out.println( “Not found” );
int populationSize = people.size();
12.
12
Generic collections
FromJava 5, all collection interfaces
and classes have been redefined as
Generics
Use of generics lead to code that is
safer
more compact
easier to understand
equally performing
13.
13
Generic list -excerpt
public interface List<E>{
void add(E x);
Iterator<E> iterator();
}
public interface Iterator<E>{
E next();
boolean hasNext();
}
14.
14
Example
Using a listof Integers
Without generics ( ArrayList list )
list.add(0, new Integer(42));
int n= ((Integer)(list.get(0))).intValue();
With generics ( ArrayList<Integer> list )
list.add(0, new Integer(42));
int n= ((Integer)(list.get(0))).intValue();
+ autoboxing ( ArrayList<Integer> list )
list.add(0,new Integer(42));
int total = list.get(0).intValue();
16
List
Can containduplicate elements
Insertion order is preserved
User can define insertion point
Elements can be accessed by position
Augments Collection interface
17.
17
List additional methods
Object get(int index)
Object set(int index, Object element)
void add(int index, Object element)
Object remove(int index)
boolean addAll(int index, Collection c)
int indexOf(Object o)
int lastIndexOf(Object o)
List subList(int fromIndex, int toIndex)
18.
18
List implementations
ArrayList
get(n)
Constant time
Insert (beginning)
and delete while
iterating
Linear
LinkedList
get(n)
Linear time
Insert (beginning)
and delete while
iterating
Constant
20
Example I
LinkedList<Integer> ll=
new LinkedList<Integer>();
ll.add(new Integer(10));
ll.add(new Integer(11));
ll.addLast(new Integer(13));
ll.addFirst(new Integer(20));
//20, 10, 11, 13
21.
21
Example II
Car[] garage= new Car[20];
garage[0] = new Car();
garage[1] = new ElectricCar();
garage[2] = new ElectricCar();
garage[3] = new Car();
for(int i=0; i<garage.length; i++){
garage[i].turnOn();
}
Null pointer error
List<Car> garage = new ArrayList<Car>(20);
garage.set( 0, new Car() );
garage.set( 1, new ElectricCar() );
garage.set( 2, new ElectricCar() );
garage.set( 3, new Car());
for(int i; i<garage.size(); i++){
Car c = garage.get(i);
c.turnOn();
}
22.
22
Example III
List l= new ArrayList(2); // 2 refs to null
l.add(new Integer(11)); // 11 in position 0
l.add(0, new Integer(13)); // 11 in position 1
l.set(0, new Integer(20)); // 13 replaced by 20
l.add(9, new Integer(30)); // NO: out of
bounds
l.add(new Integer(30)); // OK, size
extended
23.
23
Queue
Collection whoseelements have an
order (
not and ordered collection though
Defines a head position where is the
first element that can be accessed
peek()
poll()
25
Queue example
Queue<Integer> fifo=
new LinkedList<Integer>();
Queue<Integer> pq =
new PriorityQueue<Integer>();
fifo.add(3); pq.add(3);
fifo.add(1); pq.add(1);
fifo.add(2); pq.add(2);
System.out.println(fifo.peek()); // 3
System.out.println(pq.peek()); // 1
26.
26
Set
Contains nomethods other than those
inherited from Collection
add()has restriction that no duplicate
elements are allowed
e1.equals(e2) == false e1,e2
Iterator
The elements are traversed in no
particular order
27.
The equals() Contract
•It is reflexive: x.equals(x) == true
• It is symmetric: x.equals(y) == y.equals(x)
• It is transitive: for any reference values x, y, and z,
if x.equals(y) == true AND y.equals(z) == true
=> x.equals(z) == true
• It is consistent: for any reference values x and y,
multiple invocations of x.equals(y) consistently return
true (or false), provided that no information used in
equals comparisons on the object is modified.
• x.equals(null) == false
The hashCode() contract
•The hashCode() method must consistently
return the same int, if no information used in
equals() comparisons on the object is modified.
• If two objects are equal for equals() method,
then calling the hashCode() method on the two
objects must produce the same integer result.
• If two objects are unequal for equals() method,
then calling the hashCode() method on the two
objects MAY produce distinct integer results.
• producing distinct int results for unequal objects
may improve the performance of hashtables
equals() and hashcode()
equals() and hashCode() are bound together by
a joint contract that specifies if two objects are
considered equal using the equals() method,
then they must have identical hashcode values.
To be truly safe:
If override equals(), override hashCode()
Objects that are equals have to return identical
hashcodes.
32.
32
SortedSet
No duplicateelements
Iterator
The elements are traversed according to the
natural ordering (ascending)
Augments Set interface
Object first()
Object last()
SortedSet headSet(Object toElement)
SortedSet tailSet(Object fromElement)
SortedSet subSet(Object from, Object to)
33.
33
Set implementations
HashSetimplements Set
Hash tables as internal data structure
(faster)
LinkedHashSet extends HashSet
Elements are traversed by iterator
according to the insertion order
TreeSet implements SortedSet
R-B trees as internal data structure
(computationally expensive)
34.
34
Note on sortedcollections
Depending on the constructor used
they require different implementation
of the custom ordering
TreeSet()
Natural ordering (elements must be
implementations of Comparable)
TreeSet(Comparator c)
Ordering is according to the comparator
rules, instead of natural ordering
36
SortedMap
The elementsare traversed according
to the keys’ natural ordering
(ascending)
Augments Map interface
SortedMap subMap(K fromKey, K toKey)
SortedMap headMap(K toKey)
SortedMap tailMap(K fromKey)
K firstKey()
K lastKey()
37.
37
Map implementations
Analogousof Set
HashMap implements Map
No order
LinkedHashMap extends HashMap
Insertion order
TreeMap implements SortedMap
Ascending key order
38.
38
HashMap
Get/set takesconstant time (in case of
no collisions)
Automatic re-allocation when load
factor reached
Constructor optional arguments
load factor (default = .75)
initial capacity (default = 16)
39.
39
Using HashMap
Map<String,Student> students=
new HashMap<String,Student>();
students.put(“123”,
new Student(“123”,“Joe Smith”));
Student s = students.get(“123”);
for(Student si: students.values()){
}
41
Iterators and iteration
A common operation with collections
is to iterate over their elements
Interface Iterator provides a
transparent means to cycle through all
elements of a Collection
Keeps track of last visited element of
the related collection
Each time the current element is
queried, it moves on automatically
43
Iterator examples
Collection<Person> persons=
new LinkedList<Person>();
…
for(Iterator<Person> i = persons.iterator();
i.hasNext(); ) {
Person p = i.next();
…
System.out.println(p);
}
Print all objects in a list
45
Iteration examples
Map<String,Person> people=
new HashMap<String,Person>();
…
Collection<Person> values = people.values();
for(Person p: values) {
System.out.println(p);
}
Print all values in a map
(variant using while)
46.
46
Iteration examples
Map<String,Person> people=
new HashMap<String,Person>();
…
Collection<String> keys = people.keySet();
for(String ssn: keys) {
Person p = people.get(ssn);
System.out.println(ssn + " - " + p);
}
Print all keys AND values in a map
47.
47
Iterator examples (untilJava 1.4)
Collection persons = new LinkedList();
…
for(Iterator i= persons.iterator(); i.hasNext(); ) {
Person p = (Person)i.next();
…
}
Print all objects in a list
48.
48
Iteration examples (untilJava 1.4)
Map people = new HashMap();
…
Collection values = people.values();
Iterator i = values.iterator();
while( i.hasNext() ) {
Person p = (Person)i.next();
…
}
Print all values in a map
(variant using while)
49.
49
Iteration examples (untilJava 1.4)
Map people = new HashMap();
…
Collection keys = people.keySet();
for(Iterator i= keys.iterator(); i.hasNext();) {
String ssn = (String)i.next();
Person p = (Person)people.get(ssn);
…
}
Print all keys AND values in a map
50.
50
Note well
Itis unsafe to iterate over a collection
you are modifying (add/del) at the
same time
Unless you are using the iterator
methods
Iterator.remove()
ListIterator.add()
56
Comparable interface
Comparesthe receiving object with the
specified object.
Return value must be:
<0 if this precedes obj
==0 if this has the same order as obj
>0 if this follows obj
public interface Comparable<T> {
public int compareTo(T obj);
}
57.
57
Comparable
The interfaceis implemented by language
common types in packages java.lang and
java.util
String objects are lexicographically
ordered
Date objects are chronologically ordered
Number and sub-classes are ordered
numerically
58.
58
Custom ordering
Howto define an ordering upon
Student objects according to the
“natural alphabetic order”
public class Student
implements Comparable<Student>{
private String first;
private String last;
public int compareTo(Student o){
...
}
}
59.
59
Custom ordering
public intcompareTo(Student o){
int cmp = lastName.compareTo(s.lastName);
if(cmp!=0)
return cmp;
else
return firstName.compareTo(s.firstName);
}
60.
60
Ordering “the oldway”
In pre Java 5 code we had:
public int compareTo(Object obj)
No control on types
A cast had to be performed within the
method
Possible ClassCastException when
comparing objects of unrelated types
61.
61
Ordering “the oldway”
public int compareTo(Object obj){
Student s = (Student)obj;
int cmp = lastName.compareTo(s.lastName);
if(cmp!=0)
return cmp;
else
return firstName.compareTo(s.firstName);
}
possible
run-time error
62.
62
Custom ordering (alternative)
java.util
Compares its two arguments
Return value must be
<0 if o1 precedes o2
==0 if o1 has the same ordering as o2
>0 if o1 follows o2
public interface Comparator<T> {
public int compare(T o1, T o2);
}
63.
63
Custom ordering (alternative)
classStudentIDComparator
implements Comparator<Student> {
public int compare(Student s1, Student s2){
return s1.getID() - s2.getID();
}
}
Usually used to define alternative orderings
to Comparable
The “old way” version compares two Object
references
65
Algorithms
Static methodsof java.util.Collections class
Work on lists
sort() - merge sort, n log(n)
binarySearch() – requires ordered sequence
shuffle() – unsort
reverse() - requires ordered sequence
rotate() – of given a distance
min(), max() – in a Collection
66.
66
Sort method
Twogeneric overloads:
on Comparable objects:
public static <T extends Comparable<? super T>>
void sort(List<T> list)
using a Comparator object:
public static <T>
void sort(List<T> list, Comparator<? super T>)
67.
67
Sort generic
Why<? super T> instead of just <T> ?
Suppose you define
– MasterStudent extends Student { }
Intending to inherit the Student ordering
– It does not implement
Comparable<MasterStudent>
– But MasterStudent extends (indirectly)
Comparable<Student>
T extends Comparable<? super T>
Student MasterStudentMasterStudent
68.
68
Custom ordering (alternative)
Liststudents = new LinkedList();
students.add(new Student(“Mary”,“Smith”,34621));
students.add(new Student(“Alice”,“Knight”,13985));
students.add(new Student(“Joe”,“Smith”,95635));
Collections.sort(students); // sort by name
Collections.sort(students,
new StudentIDComparator()); // sort by ID
69.
69
Search
<T> intbinarySearch(List<? extends
Comparable<? super T>> l, T key)
Searches the specified object
List must be sorted into ascending order
according to natural ordering
<T> int binarySearch(List<? extends T> l,
T key, Comparator<? super T> c)
Searches the specified object
List must be sorted into ascending order
according to the specified comparator
70.
70
Algorithms - Arrays
Static methods of java.util.Arrays class
Work on object arrays
sort()
binarySearch()
71.
71
Search - Arrays
int binarySearch(Object[] a, Object key)
Searches the specified object
Array must be sorted into ascending
order according to natural ordering
int binarySearch(Object[] a, Object key,
Comparator c)
Searches the specified object
Array must be sorted into ascending
order according to the specified
comparator