KEMBAR78
Java Collections Framework | PPT
ALLPPT.com _ Free PowerPoint Templates, Diagrams and Charts
By
Anup Kumar Sahoo
Date- 05.01.2015
Collection Framework
 Collection Framework
 Design scenarios to illustrate usage of collection classes and interfaces
List – Sort, Binary Search and other utility methods
 Arrays - Sort, Binary Search and other utility methods
 Comparator and Comparable interfaces
 Effect of natural ordering of primitive and String classes on sorting.
 When to use which Data Structure
 Best Practices
 Questions : Choose a collection based on a stated requirement
 Questions : SCJP
Agenda
Collections Framework
A framework is an extensive set of interfaces, abstract classes and
concrete classes together with support tools
Framework is provided in java.util package and comprises three
parts:
1. Core interfaces
2. Set of implementations.
3. Utility methods
Collection Interfaces
Collections are primarily defined through a set of
interfaces
 Supported by a set of classes that implement the
interfaces
 Does not hold primitives, use wrapper classes
 Collections can be type safe, i.e. type of elements
can be specified using Generics
Example - Type Safe:
Collection<String> stringCollection = new LinkedList<String>();
stringCollection.add(“GoodMorning’); - Right
stringCollection.add(8); - Wrong
Collection<Integer> integerCollection = new LinkedList<Integer>();
integerCollection.add(10);
integerCollection.add(new Integer(12));
integerCollection.add(“hello”); - Wrong
Hierarchy
General Purpose Implementations
Implementing Map Interface
Primary Classifications
Collections can be primarily grouped into four types
 List – Lists of things
 Sets – Unique things
 Maps – Things with a unique ID
 Queues – Things arranged by the order in which
they are to be processed
Above can be further classified into
 Sorted
 Unsorted
 Ordered
 Unordered
Primary Classifications
An implementation class can be
- unsorted and unordered
- ordered but unsorted
- ordered and sorted
- but implementation class can never be sorted and
unordered.
 Ordered collection ?
 Sorted collection ?
List Interface
Also called as sequence, is an ordered collection that can contain
duplicate elements
List indices are zero based
One thing that list has and non-lists don’t have is a set of
methods related to index.
 get(int index), indexOf(Object o), add(int index, Object obj)
List Example
Iterator Interface
Set Interface
Allows only unique elements
equals() methods determines whether two methods are identical
HashSet
- Uses hashcode of the inserted object, implemented using a hash table
- No ordering of elements
- add, remove and contains methods have constant time complexity
LinkedHashSet
- Ordered version of HashSet that maintains doubly linked list
- Useful in making set copies, such that original set’s iteration ordering is
preserved
TreeSet
- Sorted collection. Implemented using tree structure and guarantees ordering of
elements (natural order - ascending)
- add, remove and contains methods have logarithmic time complexity
Note: While using HashSet or LinkedHashSet, the objects added to them must override
hashCode().
Set Interface Ex.
Map Interface
Maps are similar to collections but are actually represented by an
entirely different class hierarchy
Map is an object that maps keys to values
Also called as Associative array or a dictionary
Depends on equals() method to determine whether two keys are same
or different . Keys cannot be duplicated.
Methods to retrieve key, values and key–value pair
- keySet() : returns a Set
- values() : returns a Collection
- entrySet() : returns a Set
Map Implementation
HashMap
- The implementation is based on a hash table.
- No ordering on (key, value) pairs – unsorted and unordered
- Allows one null key and multiple null values
 Hashtable
- Methods are synchronized
- Key or value cannot be null
 LinkedHashMap
- Maintains insertion order.
- Provides fast iteration but slower in adding and removing
operation
TreeMap
- Sorted map. Sorted by natural order and also allows to define
custom sort order.
- Implementation based on tree structure. (key – value) pairs
are ordered on the key.
Map Example
Map<String,String> map = new HashMap<String,String>();
map.put(“rama", "03-9516743");
map.put(“Sita", "09-5076452");
map.put("Leo", "08-5530098");
map.put("Rita", "06-8201124");
System.out.println(map);
//Iterating over key
for (String key : map.keySet()) {System.out.println(key);}
//Iterating over key-value pair
for (Map.Entry<String,String> entry: map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
Output: {Leo=08-5530098, rama=03-9516743, Sita=06-8201124}
Queue Interface
Queues support all of the standard Collection methods
Queue Implementation :
Priority Queue:
- purpose is to create a “priority-in, priority out” queue as
opposed to FIFO queue.
- Elements are either ordered naturally or according to
Comparator
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(3);
queue.add(1);
queue.add(new Integer(1));
queue.add(new Integer(6));
queue.remove();
System.out.println(queue);
Understand
 equals()
Collections Algorithm
 Defined in Collections class
 Main Algorithms
- sort
- binarySearch
- reverse
- shuffle
- min
- max
use of word Collection
 collection (lowercase c), which represents any of the data structures
in which objects are stored and iterated over.
 Collection (capital C), which is actually the java.util.Collection
interface from which Set, List, and Queue extend. (That's right,
extend, not implement. There are no direct implementations of
Collection.)
 Collections (capital C and ends with s) is the java.util.Collections
class that holds a pile of static utility methods for use with
collections.
ArrayList and Arrays
 Manipulate by Sorting
 Performing a binary search
 Converting the list to array and array to list
 Use java.util.Comparator and java.lang.Comparable to affect
sorting
ArrayList
Advantages over Array
- It can grow dynamically
- provides more powerful insertion and search mechanisms
than arrays
Ex:import java.util.*;
public class TestArrayList {
public static void main(String[] args) {
List<String> test = new ArrayList<String>();
String s = "hi";
test.add("string");
test.add(s);
test.add(s+s);
System.out.println(test.size());
System.out.println(test.contains(42));
System.out.println(test.contains("hihi"));
test.remove("hi");
System.out.println(test.size());
} }
Output : 3 false true 2
Sorting Collections
import java.util.*;
class TestSort1 {
public static void main(String[] args) {
ArrayList<String> stuff = new ArrayList<String>();
stuff.add("Denver");
stuff.add("Boulder");
stuff.add("Vail");
stuff.add("Aspen");
stuff.add("Telluride");
System.out.println("unsorted " + stuff);
Collections.sort(stuff);
System.out.println("sorted " + stuff);
}
}
Output:
unsorted [Denver, Boulder, Vail, Aspen, Telluride]
sorted [Aspen, Boulder, Denver, Telluride, Vail]
Comparable interface
Illustrate an example – MusicList
Used by Collections.sort() method and Arrays.sort() to sort lists
and arrays respectively.
Only one sort sequence can be created
compareTo() method should be implemented
int x = thisObject.compareTo(anotherObject); returns negative, positive or zero
value
Ex:
Class MusicInfo implements Comparable< MusicInfo > {
String title;
// existing code
public int compareTo(MusicInfo d) {
return title.compareTo(d.getTitle());
} }
Comparator Interface
 The Comparator interface provides the capability to sort a given
collection any number of different ways.
 Can be used to sort instances of any class
 Easy to implement and has a method compare()
 Example
import java.util.*;
class GenreSort implements Comparator<DVDInfo> {
public int compare(DVDInfo one, DVDInfo two) {
return one.getGenre().compareTo(two.getGenre());
}
}
Comparator vs Comparable
Comparable Comparator
int objOne.compareTo(objTwo) int compare(objOne, objTwo)
Returns
negative if objOne < objTwo
zero if objOne == objTwo
positive if objOne > objTwo
Same as Comparable
You must modify the class whose
instances you want to sort.
You build a class separate from the
class whose instances you
want to sort.
Only one sort sequence can be created
Implemented by String, Wrapper classes, Date, etc
Many sort sequences can be
created
Implemented by third party classes
Sorting Arrays
 Arrays.sort(arrayToSort)
 Arrays.sort(arrayToSort, Comparator)
 sort() method has been overloaded many times to provide sort
methods for every type of primitive.
 Primitives are always sorted based on natural order
Note : Elements to be sorted must be mutually comparable
Searching Arrays and Collections
Certain rules apply while searching
1. Searches are performed using the binarySearch() method.
2. Successful searches return the int index of the element being
searched.
3. Unsuccessful searches return an int index that represents the
insertion point.
4. The collection/array being searched must be sorted before you
can search it.
5. If you attempt to search an array or collection that has not
already been sorted, the results of the search will not be
predictable.
6. If the collection/array you want to search was sorted in
natural order, it must be searched in natural order.
7. If the collection/array you want to search was sorted using a
Comparator, it must be searched using the same Comparator, which is
passed as the second argument to the binarySearch() method. Remember
that Comparators cannot be used when searching arrays of primitives.
Example for Binary Search
import java.util.*;
class SearchObjArray {
– public static void main(String [] args) {
– String [] sa = {"one", "two", "three", "four"};
– Arrays.sort(sa); // #1
– for(String s : sa)
– System.out.print(s + " ");
– System.out.println("none = "
– + Arrays.binarySearch(sa,"one")); // #2
– System.out.println("now reverse sort");
– ReSortComparator rs = new ReSortComparator(); // #3
– Arrays.sort(sa,rs);
– for(String s : sa)
– System.out.print(s + " ");
– System.out.println("none = "
– + Arrays.binarySearch(sa,"one")); // #4
– System.out.println("one = "
– + Arrays.binarySearch(sa,"one",rs)); // #5
– }
– static class ReSortComparator
– implements Comparator<String> { // #6
– public int compare(String a, String b) {
– return b.compareTo(a); // #7
– }
– }
– }
four one three two -> array
sorted alphabetically
one = 1 ->
search for element location 1
now reverse sort
two three one four -> reverse
sort
one = -1
one = 2 ->
search passing the comparator
Result
Converting Arrays – Lists -Arrays
 The List and Set classes have toArray() methods
 The Arrays class has a method called asList()
Ex:
String[] sa = {"one", "two", "three", "four"};
List sList = Arrays.asList(sa); // make a List
System.out.println("size " + sList.size());
System.out.println("idx2 " + sList.get(2));
sList.set(3,"six"); // change List
sa[1] = "five"; // change array
for(String s : sa)
System.out.print(s + " ");
System.out.println("nsl[1] " + sList.get(1));
This produces :
– size 4
– idx2 three
– one five three six
– sl[1] five
Example : List to Array
List<Integer> iL = new ArrayList<Integer>();
for(int x=0; x<3; x++)
iL.add(x);
Object[] oa = iL.toArray(); // create an Object array
Integer[] ia2 = new Integer[3];
ia2 = iL.toArray(ia2); // create an Integer array
Natural ordering
spaces sort before characters and that uppercase letters sort
before lowercase characters
String[] sa = {">ff<", "> f<", ">f <", ">FF<" }; // ordered?
PriorityQueue<String> pq3 = new PriorityQueue<String>();
for(String s : sa)
pq3.offer(s);
for(String s : sa)
System.out.print(pq3.poll() + " ");
This produces:
> f< >FF< >f < >ff<
Learning's
Specify an implementation only when a collection is constructed
- public void mySet(HashSet s){…} -> Works
- public void mySet(Set s) {…} -> Better
- s.add() invokes HashSet.add() -> Polymorphism
 ArrayLists behave like Vectors without synchronization and therefore execute
faster than Vectors because ArrayLists do not have the overhead of thread
synchronization.
ArrayList implements the RandomAccess interface, and LinkedList. does not. Note
that Collections.binarySearch does take advantage of the RandomAccess property, to
optimize searches
LinkedLists can be used to create stacks, queues, trees and deques (double-ended
queues, pronounced “decks”). The collections framework provides implementations of
some of these data structures.
Appending elements to the end of a list has a fixed averaged cost for both
ArrayList and LinkedList. For ArrayList, appending typically involves setting an
internal array location to the element reference, but occasionally results in the
array being reallocated. For LinkedList, the cost is uniform and involves allocating
an internal Entry object.
Learning's
 Inserting or deleting elements in the middle of an ArrayList implies that the
rest of the list must be moved. Inserting or deleting elements in the middle of
a LinkedList has fixed cost.
 A LinkedList does not support efficient random access
An ArrayList has space overhead in the form of reserve capacity at the end of
the list. A LinkedList has significant space overhead per element
Use a Tree only if you need them sorted, otherwise use a Hash
Sometimes a Map structure is a better choice than a List.
There is one exception to the rule that LinkedHashSets are slower than
HashSets: iteration over a LinkedHashSet is generally faster than iteration over
a HashSet
LinkedHashSet and TreeSet cost more than HashSet, but do more. A LinkedHashSet
is useful in making set copies, such that the original set's iteration ordering
is preserved:
void f(Set s) { Set copy = new LinkedHashSet(s);}
Java Collections Framework

Java Collections Framework

  • 1.
    ALLPPT.com _ FreePowerPoint Templates, Diagrams and Charts By Anup Kumar Sahoo Date- 05.01.2015 Collection Framework
  • 2.
     Collection Framework Design scenarios to illustrate usage of collection classes and interfaces List – Sort, Binary Search and other utility methods  Arrays - Sort, Binary Search and other utility methods  Comparator and Comparable interfaces  Effect of natural ordering of primitive and String classes on sorting.  When to use which Data Structure  Best Practices  Questions : Choose a collection based on a stated requirement  Questions : SCJP Agenda
  • 3.
    Collections Framework A frameworkis an extensive set of interfaces, abstract classes and concrete classes together with support tools Framework is provided in java.util package and comprises three parts: 1. Core interfaces 2. Set of implementations. 3. Utility methods
  • 4.
    Collection Interfaces Collections areprimarily defined through a set of interfaces  Supported by a set of classes that implement the interfaces  Does not hold primitives, use wrapper classes  Collections can be type safe, i.e. type of elements can be specified using Generics Example - Type Safe: Collection<String> stringCollection = new LinkedList<String>(); stringCollection.add(“GoodMorning’); - Right stringCollection.add(8); - Wrong Collection<Integer> integerCollection = new LinkedList<Integer>(); integerCollection.add(10); integerCollection.add(new Integer(12)); integerCollection.add(“hello”); - Wrong
  • 5.
  • 6.
  • 7.
  • 8.
    Primary Classifications Collections canbe primarily grouped into four types  List – Lists of things  Sets – Unique things  Maps – Things with a unique ID  Queues – Things arranged by the order in which they are to be processed Above can be further classified into  Sorted  Unsorted  Ordered  Unordered
  • 9.
    Primary Classifications An implementationclass can be - unsorted and unordered - ordered but unsorted - ordered and sorted - but implementation class can never be sorted and unordered.  Ordered collection ?  Sorted collection ?
  • 10.
    List Interface Also calledas sequence, is an ordered collection that can contain duplicate elements List indices are zero based One thing that list has and non-lists don’t have is a set of methods related to index.  get(int index), indexOf(Object o), add(int index, Object obj)
  • 11.
  • 12.
  • 13.
    Set Interface Allows onlyunique elements equals() methods determines whether two methods are identical HashSet - Uses hashcode of the inserted object, implemented using a hash table - No ordering of elements - add, remove and contains methods have constant time complexity LinkedHashSet - Ordered version of HashSet that maintains doubly linked list - Useful in making set copies, such that original set’s iteration ordering is preserved TreeSet - Sorted collection. Implemented using tree structure and guarantees ordering of elements (natural order - ascending) - add, remove and contains methods have logarithmic time complexity Note: While using HashSet or LinkedHashSet, the objects added to them must override hashCode().
  • 14.
  • 15.
    Map Interface Maps aresimilar to collections but are actually represented by an entirely different class hierarchy Map is an object that maps keys to values Also called as Associative array or a dictionary Depends on equals() method to determine whether two keys are same or different . Keys cannot be duplicated. Methods to retrieve key, values and key–value pair - keySet() : returns a Set - values() : returns a Collection - entrySet() : returns a Set
  • 16.
    Map Implementation HashMap - Theimplementation is based on a hash table. - No ordering on (key, value) pairs – unsorted and unordered - Allows one null key and multiple null values  Hashtable - Methods are synchronized - Key or value cannot be null  LinkedHashMap - Maintains insertion order. - Provides fast iteration but slower in adding and removing operation TreeMap - Sorted map. Sorted by natural order and also allows to define custom sort order. - Implementation based on tree structure. (key – value) pairs are ordered on the key.
  • 17.
    Map Example Map<String,String> map= new HashMap<String,String>(); map.put(“rama", "03-9516743"); map.put(“Sita", "09-5076452"); map.put("Leo", "08-5530098"); map.put("Rita", "06-8201124"); System.out.println(map); //Iterating over key for (String key : map.keySet()) {System.out.println(key);} //Iterating over key-value pair for (Map.Entry<String,String> entry: map.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } Output: {Leo=08-5530098, rama=03-9516743, Sita=06-8201124}
  • 18.
    Queue Interface Queues supportall of the standard Collection methods Queue Implementation : Priority Queue: - purpose is to create a “priority-in, priority out” queue as opposed to FIFO queue. - Elements are either ordered naturally or according to Comparator Queue<Integer> queue = new LinkedList<Integer>(); queue.add(3); queue.add(1); queue.add(new Integer(1)); queue.add(new Integer(6)); queue.remove(); System.out.println(queue); Understand  equals()
  • 19.
    Collections Algorithm  Definedin Collections class  Main Algorithms - sort - binarySearch - reverse - shuffle - min - max
  • 20.
    use of wordCollection  collection (lowercase c), which represents any of the data structures in which objects are stored and iterated over.  Collection (capital C), which is actually the java.util.Collection interface from which Set, List, and Queue extend. (That's right, extend, not implement. There are no direct implementations of Collection.)  Collections (capital C and ends with s) is the java.util.Collections class that holds a pile of static utility methods for use with collections.
  • 21.
    ArrayList and Arrays Manipulate by Sorting  Performing a binary search  Converting the list to array and array to list  Use java.util.Comparator and java.lang.Comparable to affect sorting
  • 22.
    ArrayList Advantages over Array -It can grow dynamically - provides more powerful insertion and search mechanisms than arrays Ex:import java.util.*; public class TestArrayList { public static void main(String[] args) { List<String> test = new ArrayList<String>(); String s = "hi"; test.add("string"); test.add(s); test.add(s+s); System.out.println(test.size()); System.out.println(test.contains(42)); System.out.println(test.contains("hihi")); test.remove("hi"); System.out.println(test.size()); } } Output : 3 false true 2
  • 23.
    Sorting Collections import java.util.*; classTestSort1 { public static void main(String[] args) { ArrayList<String> stuff = new ArrayList<String>(); stuff.add("Denver"); stuff.add("Boulder"); stuff.add("Vail"); stuff.add("Aspen"); stuff.add("Telluride"); System.out.println("unsorted " + stuff); Collections.sort(stuff); System.out.println("sorted " + stuff); } } Output: unsorted [Denver, Boulder, Vail, Aspen, Telluride] sorted [Aspen, Boulder, Denver, Telluride, Vail]
  • 24.
    Comparable interface Illustrate anexample – MusicList Used by Collections.sort() method and Arrays.sort() to sort lists and arrays respectively. Only one sort sequence can be created compareTo() method should be implemented int x = thisObject.compareTo(anotherObject); returns negative, positive or zero value Ex: Class MusicInfo implements Comparable< MusicInfo > { String title; // existing code public int compareTo(MusicInfo d) { return title.compareTo(d.getTitle()); } }
  • 25.
    Comparator Interface  TheComparator interface provides the capability to sort a given collection any number of different ways.  Can be used to sort instances of any class  Easy to implement and has a method compare()  Example import java.util.*; class GenreSort implements Comparator<DVDInfo> { public int compare(DVDInfo one, DVDInfo two) { return one.getGenre().compareTo(two.getGenre()); } }
  • 26.
    Comparator vs Comparable ComparableComparator int objOne.compareTo(objTwo) int compare(objOne, objTwo) Returns negative if objOne < objTwo zero if objOne == objTwo positive if objOne > objTwo Same as Comparable You must modify the class whose instances you want to sort. You build a class separate from the class whose instances you want to sort. Only one sort sequence can be created Implemented by String, Wrapper classes, Date, etc Many sort sequences can be created Implemented by third party classes
  • 27.
    Sorting Arrays  Arrays.sort(arrayToSort) Arrays.sort(arrayToSort, Comparator)  sort() method has been overloaded many times to provide sort methods for every type of primitive.  Primitives are always sorted based on natural order Note : Elements to be sorted must be mutually comparable
  • 28.
    Searching Arrays andCollections Certain rules apply while searching 1. Searches are performed using the binarySearch() method. 2. Successful searches return the int index of the element being searched. 3. Unsuccessful searches return an int index that represents the insertion point. 4. The collection/array being searched must be sorted before you can search it. 5. If you attempt to search an array or collection that has not already been sorted, the results of the search will not be predictable. 6. If the collection/array you want to search was sorted in natural order, it must be searched in natural order. 7. If the collection/array you want to search was sorted using a Comparator, it must be searched using the same Comparator, which is passed as the second argument to the binarySearch() method. Remember that Comparators cannot be used when searching arrays of primitives.
  • 29.
    Example for BinarySearch import java.util.*; class SearchObjArray { – public static void main(String [] args) { – String [] sa = {"one", "two", "three", "four"}; – Arrays.sort(sa); // #1 – for(String s : sa) – System.out.print(s + " "); – System.out.println("none = " – + Arrays.binarySearch(sa,"one")); // #2 – System.out.println("now reverse sort"); – ReSortComparator rs = new ReSortComparator(); // #3 – Arrays.sort(sa,rs); – for(String s : sa) – System.out.print(s + " "); – System.out.println("none = " – + Arrays.binarySearch(sa,"one")); // #4 – System.out.println("one = " – + Arrays.binarySearch(sa,"one",rs)); // #5 – } – static class ReSortComparator – implements Comparator<String> { // #6 – public int compare(String a, String b) { – return b.compareTo(a); // #7 – } – } – } four one three two -> array sorted alphabetically one = 1 -> search for element location 1 now reverse sort two three one four -> reverse sort one = -1 one = 2 -> search passing the comparator Result
  • 30.
    Converting Arrays –Lists -Arrays  The List and Set classes have toArray() methods  The Arrays class has a method called asList() Ex: String[] sa = {"one", "two", "three", "four"}; List sList = Arrays.asList(sa); // make a List System.out.println("size " + sList.size()); System.out.println("idx2 " + sList.get(2)); sList.set(3,"six"); // change List sa[1] = "five"; // change array for(String s : sa) System.out.print(s + " "); System.out.println("nsl[1] " + sList.get(1)); This produces : – size 4 – idx2 three – one five three six – sl[1] five
  • 31.
    Example : Listto Array List<Integer> iL = new ArrayList<Integer>(); for(int x=0; x<3; x++) iL.add(x); Object[] oa = iL.toArray(); // create an Object array Integer[] ia2 = new Integer[3]; ia2 = iL.toArray(ia2); // create an Integer array
  • 32.
    Natural ordering spaces sortbefore characters and that uppercase letters sort before lowercase characters String[] sa = {">ff<", "> f<", ">f <", ">FF<" }; // ordered? PriorityQueue<String> pq3 = new PriorityQueue<String>(); for(String s : sa) pq3.offer(s); for(String s : sa) System.out.print(pq3.poll() + " "); This produces: > f< >FF< >f < >ff<
  • 34.
    Learning's Specify an implementationonly when a collection is constructed - public void mySet(HashSet s){…} -> Works - public void mySet(Set s) {…} -> Better - s.add() invokes HashSet.add() -> Polymorphism  ArrayLists behave like Vectors without synchronization and therefore execute faster than Vectors because ArrayLists do not have the overhead of thread synchronization. ArrayList implements the RandomAccess interface, and LinkedList. does not. Note that Collections.binarySearch does take advantage of the RandomAccess property, to optimize searches LinkedLists can be used to create stacks, queues, trees and deques (double-ended queues, pronounced “decks”). The collections framework provides implementations of some of these data structures. Appending elements to the end of a list has a fixed averaged cost for both ArrayList and LinkedList. For ArrayList, appending typically involves setting an internal array location to the element reference, but occasionally results in the array being reallocated. For LinkedList, the cost is uniform and involves allocating an internal Entry object.
  • 35.
    Learning's  Inserting ordeleting elements in the middle of an ArrayList implies that the rest of the list must be moved. Inserting or deleting elements in the middle of a LinkedList has fixed cost.  A LinkedList does not support efficient random access An ArrayList has space overhead in the form of reserve capacity at the end of the list. A LinkedList has significant space overhead per element Use a Tree only if you need them sorted, otherwise use a Hash Sometimes a Map structure is a better choice than a List. There is one exception to the rule that LinkedHashSets are slower than HashSets: iteration over a LinkedHashSet is generally faster than iteration over a HashSet LinkedHashSet and TreeSet cost more than HashSet, but do more. A LinkedHashSet is useful in making set copies, such that the original set's iteration ordering is preserved: void f(Set s) { Set copy = new LinkedHashSet(s);}