Collections and Generics Framework: Sun Educational Services
Collections and Generics Framework: Sun Educational Services
Module 9
Collections and Generics Framework
Objectives
Describe the Collections
Describe the general purpose implementations of the
core interfaces in the Collections framework
Examine the Map interface
Examine the legacy collection classes
Create natural and custom ordering by implementing
the Comparable and Comparator interfaces
Use generic collections
Use type parameters in generic classes
Refactor existing non-generic code
Write a program to iterate over a collection
Examine the enhanced for loop
Java Programming Language
Copyright Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. Sun Services, Revision G.2
Module 9, slide 2 of 40
Module 9, slide 3 of 40
Collection
+add
+remove
+size
+isEmpty
+contains
+iterator
<<interface>>
<<interface>>
List
Set
HashSet
<<interface >>
SortedSet
+add
+remove
+get
+set
+indexOf
+listIterator
TreeSet
ArrayList
LinkedList
Module 9, slide 4 of 40
Collection Implementations
There are several general purpose implementations of the
core interfaces (Set, List, Deque and Map)
Hash
Table
Set
Resizable
Array
HashSet
Balanced
Tree
Linked List
TreeSet
LinkedHashSet
List
ArrayList
LinkedList
Deque
ArrayDeque
LinkedList
Map
HashMap
Hash Table +
Linked List
TreeMap
LinkedHashMap
Module 9, slide 5 of 40
A Set Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.*;
public class SetExample {
public static void main(String[] args) {
Set set = new HashSet();
set.add("one");
set.add("second");
set.add("3rd");
set.add(new Integer(4));
set.add(new Float(5.0F));
set.add("second");
// duplicate, not added
set.add(new Integer(4)); // duplicate, not added
System.out.println(set);
}
}
Module 9, slide 6 of 40
A List Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.*
public class ListExample {
public static void main(String[] args) {
List list = new ArrayList();
list.add("one");
list.add("second");
list.add("3rd");
list.add(new Integer(4));
list.add(new Float(5.0F));
list.add("second");
// duplicate, is added
list.add(new Integer(4)); // duplicate, is added
System.out.println(list);
}
}
Module 9, slide 7 of 40
Module 9, slide 8 of 40
Module 9, slide 9 of 40
A Map Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.*;
public class MapExample {
public static void main(String args[]) {
Map map = new HashMap();
map.put("one","1st");
map.put("second", new Integer(2));
map.put("third","3rd");
// Overwrites the previous assignment
map.put("third","III");
// Returns set view of keys
Set set1 = map.keySet();
// Returns Collection view of values
Collection collection = map.values();
// Returns set view of key value mappings
Set set2 = map.entrySet();
System.out.println(set1 + "\n" + collection + "\n" + set2);
}
}
Module 9, slide 10 of 40
A Map Example
Output generated from the MapExample program:
[second, one, third]
[2, 1st, III]
[second=2, one=1st, third=III]
Module 9, slide 11 of 40
Module 9, slide 12 of 40
Ordering Collections
The Comparable and Comparator interfaces are useful for
ordering collections:
The Comparable interface imparts natural ordering to
classes that implement it.
The Comparator interface specifies order relation. It
can also be used to override natural ordering.
Both interfaces are useful for sorting collections.
Module 9, slide 13 of 40
Module 9, slide 14 of 40
Module 9, slide 15 of 40
import java.util.*;
class Student implements Comparable {
String firstName, lastName;
int studentID=0;
double GPA=0.0;
public Student(String firstName, String lastName, int studentID,
double GPA) {
if (firstName == null || lastName == null || studentID == 0
|| GPA == 0.0) {throw new IllegalArgumentException();}
this.firstName = firstName;
this.lastName = lastName;
this.studentID = studentID;
this.GPA = GPA;
}
public String firstName() { return firstName; }
public String lastName() { return lastName; }
public int studentID() { return studentID; }
public double GPA() { return GPA; }
Module 9, slide 16 of 40
Module 9, slide 17 of 40
import java.util.*;
public class ComparableTest {
public static void main(String[] args) {
TreeSet studentSet = new TreeSet();
studentSet.add(new Student("Mike", "Hauffmann",101,4.0));
studentSet.add(new Student("John", "Lynn",102,2.8 ));
studentSet.add(new Student("Jim", "Max",103, 3.6));
studentSet.add(new Student("Kelly", "Grant",104,2.3));
Object[] studentArray = studentSet.toArray();
Student s;
for(Object obj : studentArray){
s = (Student) obj;
System.out.printf("Name = %s %s ID = %d GPA = %.1f\n",
s.firstName(), s.lastName(), s.studentID(), s.GPA());
}
}
}
Module 9, slide 18 of 40
=
=
=
=
Module 9, slide 19 of 40
Module 9, slide 20 of 40
class Student {
String firstName, lastName;
int studentID=0;
double GPA=0.0;
public Student(String firstName, String lastName,
int studentID, double GPA) {
if (firstName == null || lastName == null || studentID == 0 ||
GPA == 0.0) throw new NullPointerException();
this.firstName = firstName;
this.lastName = lastName;
this.studentID = studentID;
this.GPA = GPA;
}
public String firstName() { return firstName; }
public String lastName() { return lastName; }
public int studentID() { return studentID; }
public double GPA() { return GPA; }
}
Module 9, slide 21 of 40
import java.util.*;
public class NameComp implements Comparator {
public int compare(Object o1, Object o2) {
return
(((Student)o1).firstName.compareTo(((Student)o2).firstName));
}
}
1
import java.util.*;
2 public class GradeComp implements Comparator {
3
public int compare(Object o1, Object o2) {
4
if (((Student)o1).GPA == ((Student)o2).GPA)
5
return 0;
6
else if (((Student)o1).GPA < ((Student)o2).GPA)
7
return -1;
8
else
9
return 1;
10
}
11 }
Module 9, slide 22 of 40
import java.util.*;
public class ComparatorTest {
public static void main(String[] args) {
Comparator c = new NameComp();
TreeSet studentSet = new TreeSet(c);
studentSet.add(new Student("Mike", "Hauffmann",101,4.0));
studentSet.add(new Student("John", "Lynn",102,2.8 ));
studentSet.add(new Student("Jim", "Max",103, 3.6));
studentSet.add(new Student("Kelly", "Grant",104,2.3));
Object[] studentArray = studentSet.toArray();
Student s;
for(Object obj : studentArray) {
s = (Student) obj;
System.out.println("Name = %s %s ID = %d GPA = %.1f\n",
s.firstName(), s.lastName(), s.studentID(), s.GPA());
}
}
}
Module 9, slide 23 of 40
=
=
=
=
Jim Max ID = 0
John Lynn ID =
Kelly Grant ID
Mike Hauffmann
GPA = 3.6
0 GPA = 2.8
= 0 GPA = 2.3
ID = 0 GPA = 4.0
Module 9, slide 24 of 40
Generics
Generics are described as follows:
Provide compile-time type safety
Eliminate the need for casts
Provide the ability to create compiler-checked
homogeneous collections
Module 9, slide 25 of 40
Generics
Using non-generic collections:
ArrayList list = new ArrayList();
list.add(0, new Integer(42));
int total = ((Integer)list.get(0)).intValue();
Module 9, slide 26 of 40
import java.util.*;
public class GenSetExample {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("one");
set.add("second");
set.add("3rd");
// This line generates compile error
set.add(new Integer(4));
set.add("second");
// Duplicate, not added
System.out.println(set);
}
}
Module 9, slide 27 of 40
import java.util.*;
public class MapPlayerRepository {
HashMap<String, String> players;
public MapPlayerRepository() {
players = new HashMap<String, String> ();
}
public String get(String position) {
String player = players.get(position);
return player;
}
public void put(String position, String name) {
players.put(position, name);
}
Module 9, slide 28 of 40
Generic Class
Class
declaration
Constructor
declaration
public ArrayList
(int capacity);
public ArrayList<E>
(int capacity);
Method
declaration
Variable
declaration
examples
ArrayList list1;
ArrayList list2;
Instance
declaration
examples
Module 9, slide 29 of 40
Module 9, slide 30 of 40
SavingsAccount
CheckingAccount
Module 9, slide 31 of 40
}
}
Module 9, slide 32 of 40
List<Account> la;
List<CheckingAccount> lc = new ArrayList<CheckingAccount>();
List<SavingsAccount> ls = new ArrayList<SavingsAccount>();
//if the following were possible...
la = lc;
la.add(new CheckingAccount("Fred"));
//then the following must also be possible...
la = ls;
la.add(new CheckingAccount("Fred"));
//so...
SavingsAccount sa = ls.get(0); //aarrgghh!!
Module 9, slide 33 of 40
Module 9, slide 34 of 40
import java.util.*;
public class GenericsWarning {
public static void main(String[] args) {
List list = new ArrayList();
list.add(0, new Integer(42));
int total = ((Integer)list.get(0).intValue();
}
}
javac GenericsWarning.java
Note: GenericsWarning.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
javac -Xlint:unchecked GenericsWarning.java
GenericsWarning.java:7: warning: [unchecked] unchecked call to add(int,E)
as a member of the raw type java.util.ArrayList
list.add(0, new Integer(42));
^
1 warning
Java Programming Language
Copyright Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. Sun Services, Revision G.2
Module 9, slide 35 of 40
Iterators
1
2
3
4
5
6
Module 9, slide 36 of 40
Iterator<E>
+hasNext() : boolean
+next() : E
+remove()
interface
ListIterator<E>
+hasPrevious() : boolean
+previous() : E
+add(element : E)
+set(element : E)
Java Programming Language
Copyright Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. Sun Services, Revision G.2
Module 9, slide 37 of 40
Module 9, slide 38 of 40
Module 9, slide 39 of 40
List<Subject> subjects=...;
List<Teacher> teachers=...;
List<Course> courseList = ArrayList<Course)();
for (Subject subj: subjects) {
for (Teacher tchr: teachers) {
courseList.add(new Course(subj, tchr));
}
}
Module 9, slide 40 of 40