java collections framework - polito.it3 framework interfaces (adt, abstract data types)...

31
Java Collections Framework Version 3.3.1 - April 2018 © Maurizio Morisio, Marco Torchiano, 2018 Object Oriented Programming http://softeng.polito.it/courses/09CBI Licensing Note 2 This work is licensed under the Creative Commons Attribution- NonCommercial-NoDerivatives 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/ . You are free: to copy, distribute, display, and perform the work Under the following conditions: § Attribution. You must attribute the work in the manner specified by the author or licensor. § Non-commercial. You may not use this work for commercial purposes. § No Derivative Works. You may not alter, transform, or build upon this work. § For any reuse or distribution, you must make clear to others the license terms of this work. § Any of these conditions can be waived if you get permission from the copyright holder. Your fair use and other rights are in no way affected by the above.

Upload: others

Post on 02-Jun-2020

32 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

Java Collections Framework

Version 3.3.1 - April 2018 © Maurizio Morisio, Marco Torchiano, 2018

Object Oriented Programming

http://softeng.polito.it/courses/09CBI

Licensing Note

2

This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. You are free: to copy, distribute, display, and perform the work

Under the following conditions: §  Attribution. You must attribute the work in the manner specified by

the author or licensor.

§  Non-commercial. You may not use this work for commercial purposes.

§  No Derivative Works. You may not alter, transform, or build upon this work.

§  For any reuse or distribution, you must make clear to others the license terms of this work.

§  Any of these conditions can be waived if you get permission from the copyright holder.

Your fair use and other rights are in no way affected by the above.

Page 2: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

3

Framework §  Interfaces (ADT, Abstract Data Types) §  Implementations (of ADT) §  Algorithms (sort) §  Contained in the package java.util § Originally using Object, since Java 5

redefined as generic

4

Interfaces

Collection<E>

Set<E> List<E>

Map<K,V>

SortedSet<E> SortedMap<K,V>

Group containers Associative containers

Queue<E>

Iterable<E>

Page 3: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

5

Implementations

TreeSet

TreeMap Array List

Linked List

HashMap

Linked HashMap

Linked HashSet

HashSet

Map<K,V>

Sorted Map<K,V>

Collection<E>

Set<E> List<E>

Sorted Set<E>

Queue<E>

Priority Queue

Interfaces

Classes

6

Internals

interface

data structure

classes

Hash table

Balanced tree

Resizable array

Linked list HT + LL

Set HashSet TreeSet Linked HashSet

List ArrayList LinkedList

Map HashMap TreeMap Linked HashMap

Page 4: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

GROUP CONTAINERS (COLLECTIONS)

Collection<E>

Set<E> List<E>

SortedSet<E>

Queue<E>

Collection

§  Group of elements (references to objects) §  It is not specified whether they are

w Ordered / not ordered w Duplicated / not duplicated

§  Implements Iterable §  Two constructors common to all classes

implementing Collection w  C() w  C(Collection c)

8

Page 5: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

Collection interface int size() boolean isEmpty() boolean contains(E element) boolean containsAll(Collection<?> c) boolean add(E element) boolean addAll(Collection<? extends E> c) boolean remove(E element) boolean removeAll(Collection<?> c) void clear() Object[] toArray() Iterator<E> iterator()

9

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] );

10

Page 6: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

List

§  Can contain duplicate elements §  Insertion order is preserved §  User can define insertion point §  Elements can be accessed by position §  Augments Collection interface

11

List interface E get(int index) E set(int index, E element) void add(int index, E element) E remove(int index) boolean addAll(int index,Collection<E> c) int indexOf(E o) int lastIndexOf(E o) List<E> subList(int from, int to)

12

Page 7: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

List implementations ArrayList

§  get(n) w Constant

§  add(0,…) w  Linear

§  add() w Constant

13

LinkedList

§  get(n) w  Linear

§  add(0, … ) w Constant

§  add() w Constant

List implementations - Get

0

1000

2000

3000

4000

5000

6000

7000

8000

9000

0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000

Tim

e [n

s]

Size [# items]

LinkedList

ArrayList

Page 8: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

List Implementations - Add

0

5

10

15

20

25

30

35

0 20 40 60 80 100 120 140 160

ns

Size

add in first position in a list of given size

LinkedList

ArrayList

List Implementations - Add

0

1000

2000

3000

4000

5000

6000

7000

8000

9000

0 50 100 150 200 250 300

add given # of elements in first position

LinkedList

ArrayList

Page 9: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

List implementation - Models

t(n) = CLAdd in first pos. in list of size n

LinkedList ArrayList

t(n) = n · CA

t(n) = n · CLAdd n elements t(n) =nX

i=1

CA · i

=CA

2n · (n� 1)

CL = 16.0 ns CA = 0.2 ns

List implementations §  ArrayList<E>

w  ArrayList() w  ArrayList(int initialCapacity) w  ArrayList(Collection<E> c) w  void ensureCapacity(int minCapacity)

§  LinkedList<E> w  void addFirst(E o) w  void addLast(E o) w  E getFirst() w  E getLast() w  E removeFirst() w  E removeLast()

18

Page 10: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

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

19

Example II

20

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(); }

Page 11: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

21

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

Queue interface §  Collection whose elements have an

order w not and ordered collection though

§  Defines a head position where is the first element that can be accessed w peek() w poll()

22

Page 12: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

Queue implementations §  LinkedList

w head is the first element of the list w FIFO: Fist-In-First-Out

§  PriorityQueue w head is the smallest element

23

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

24

Page 13: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

Set interface §  Contains no methods

w Only those inherited from Collection §  add()has the restriction that no

duplicate elements are allowed w e1.equals(e2) == false ∀ e1,e2 ∈ Σ

§  Iterator

w The elements are traversed in no particular order

25

SortedSet interface §  No duplicate elements §  Iterator

w  The elements are traversed according to the natural ordering (ascending)

§  Augments Set interface w  Object first() w  Object last() w  SortedSet headSet(Object toElement) w  SortedSet tailSet(Object fromElement) w  SortedSet subSet(Object from, Object to)

26

Page 14: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

Set implementations §  HashSet implements Set

w Hash tables as internal data structure (faster)

§  LinkedHashSet extends HashSet w Elements are traversed by iterator

according to the insertion order

§  TreeSet implements SortedSet w R-B trees as internal data structure

(computationally expensive)

27

Note on sorted collections §  Depending on the constructor used

they require different implementation of the custom ordering

§  TreeSet() w Natural ordering (elements must be

implementations of Comparable) §  TreeSet(Comparator c)

w Ordering is according to the comparator rules, instead of natural ordering

28

Page 15: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

Generic collections §  Since Java 5, all collection interfaces

and classes have been redefined as Generics

§  Use of generics leads to code that is w safer w more compact w easier to understand w equally performing

29

Object list - excerpt public interface List{ void add(Object x); Object get(int i); Iterator<E> iterator(); } public interface Iterator{ Object next(); boolean hasNext(); }

30

Page 16: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

31

Example § Using a list of Integers

w Without generics ( ArrayList list ) list.add(0, new Integer(42)); int n= ((Integer)(list.get(0))).intValue();

w With generics ( ArrayList<Integer> list ) list.add(0, new Integer(42)); int n= ((Integer)(list.get(0))).intValue();

w + autoboxing ( ArrayList<Integer> list ) list.add(0,new Integer(42)); int n = ((Integer)(list.get(0))).intValue();

ITERATORS

Page 17: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

Iterable interface §  Container of elements that can be

iterated upon §  Provides a single method: Iterator<E> iterator()

w It returns the iterator on the elements of the collection

§  Collection extends Iterable

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

34

Page 18: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

Iterator

§  Allows the iteration on the elements of a collection

§  Two main methods: w boolean hasNext()

– Checks if there is a next element to iterate on w E next()

– Returns the next element and advances by one position

w void remove() – Optional method, removes the current element

Iterator examples

36

Iterable<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

Page 19: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

37

Iterator examples

Iterable<Person> persons = new LinkedList<Person>();

… for(Person p: persons) { … System.out.println(p);

}

The for-each syntax avoids using iterator directly

38

Iterator examples (until Java 1.4)

Collection persons = new LinkedList(); … for(Iterator i= persons.iterator(); i.hasNext(); ) { Person p = (Person)i.next(); … }

Print all objects in a list

Page 20: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

Iterable forEach §  Iterable defines the default method

forEach(Consumer<? super T> action)

§  Can be used to perform operations of elements with a functional interface

Iterable<Person> persons = new LinkedList<Person>();

… persons.forEach( p -> { System.out.println(p);

}

40

Note well §  It is unsafe to iterate over a collection

you are modifying (add/remove) at the same time

§  Unless you are using the iterator’s own methods w Iterator.remove() w ListIterator.add()

Page 21: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

41

Delete List<Integer> lst=new LinkedList<Integer>(); lst.add(new Integer(10)); lst.add(new Integer(11)); lst.add(new Integer(13)); lst.add(new Integer(20)); int count = 0; for (Iterator<?> itr = lst.iterator(); itr.hasNext(); ) {

itr.next(); if (count==1) lst.remove(count); // wrong count++; }

ConcurrentModificationException

42

Delete (cont�d) List<Integer> lst=new LinkedList<Integer>(); lst.add(new Integer(10)); lst.add(new Integer(11)); lst.add(new Integer(13)); lst.add(new Integer(20)); int count = 0; for (Iterator<?> itr = lst.iterator(); itr.hasNext(); ) {

itr.next(); if (count==1) itr.remove(); // ok count++; } Correct

Page 22: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

43

Add List lst = new LinkedList(); lst.add(new Integer(10)); lst.add(new Integer(11)); lst.add(new Integer(13)); lst.add(new Integer(20)); int count = 0; for (Iterator itr = lst.iterator(); itr.hasNext(); ) {

itr.next(); if (count==2) lst.add(count, new Integer(22));//wrong count++; }

ConcurrentModificationException

44

Add (cont�d) List<Integer> lst=new LinkedList<Integer>(); lst.add(new Integer(10)); lst.add(new Integer(11)); lst.add(new Integer(13)); lst.add(new Integer(20)); int count = 0; for (ListIterator<Integer> itr = lst.listIterator(); itr.hasNext();){

itr.next(); if (count==2) itr.add(new Integer(22)); // ok count++; }

Correct

Page 23: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

ASSOCIATIVE CONTAINERS (MAPS)

Map<K,V>

SortedMap<K,V>

Map §  A container that associates keys to values

(e.g., SSN ⇒ Person) §  Keys and values must be objects §  Keys must be unique

w Only one value per key §  Following constructors are common to all

collection implementers w  M() w  M(Map m)

46

Page 24: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

Map interface §  V put(K key, V value) §  V get(K key) §  Object remove(K key) §  boolean containsKey(K key) §  boolean containsValue(V value) §  public Set<K> keySet() §  public Collection<V> values() §  int size() §  boolean isEmpty() §  void clear()

47

Map example Map<String,Person> people =new HashMap<>(); 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();

48

Page 25: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

49

SortedMap interface §  The elements are traversed according

to the keys��natural ordering (ascending)

§  Augments Map interface w  SortedMap subMap(K fromKey, K toKey) w  SortedMap headMap(K toKey) w  SortedMap tailMap(K fromKey) w  K firstKey() w  K lastKey()

50

Map implementations §  Analogous to Set §  HashMap implements Map

w No order §  LinkedHashMap extends HashMap

w Insertion order §  TreeMap implements SortedMap

w Ascending key order

Page 26: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

51

HashMap

§  Get/put takes constant time (in case of no collisions)

§  Automatic re-allocation when load factor reached

§  Constructor optional arguments w load factor (default = .75) w initial capacity (default = 16)

52

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()){ }

Page 27: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

53

TreeMap

§  Get/put takes log time §  Based on a Red-Black tree §  Keys are maintained and will be

traversed in order §  Constructor optional arguments

w Comparator to replace the natural order of keys

ALGORITHMS

Page 28: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

Algorithms §  Static methods of java.util.Collections

w Work on List since it has the concept of position §  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

55

sort() method § Operates on List<T>

w Require access by index to perform sorting §  Two generic overloads:

w on Comparable objects: <T extends Comparable<? super T>> void sort(List<T> list)

w using a Comparator object: <T> void sort(List<T> list, Comparator<? super T> cmp)

56

Page 29: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

57

Sort generic

§ Why <? super T> instead of just <T> ? w Suppose you define

– MasterStudent extends Student { } w Intending to inherit the Student ordering

–  It does not implement Comparable<MasterStudent>

– But MasterStudent extends (indirectly) Comparable<Student>

T extends Comparable<? super T> Student MasterStudent MasterStudent

58

Custom ordering (alternative)

List students = 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

Page 30: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

59

Search §  <T> int binarySearch(List<? extends Comparable<? super T>> l, T key)

w Searches the specified object w List must be sorted into ascending order

according to natural ordering §  <T> int binarySearch(List<? extends T> l, T key, Comparator<? super T> c)

w Searches the specified object w List must be sorted into ascending order

according to the specified comparator

Algorithms - Arrays §  Static methods of java.util.Arrays

class w Work on object arrays

§  sort() §  binarySearch()

60

Page 31: Java Collections Framework - polito.it3 Framework Interfaces (ADT, Abstract Data Types) Implementations (of ADT) Algorithms (sort) Contained in the package java.util Originally using

61

Search - Arrays §  int binarySearch(Object[] a, Object key)

w Searches the specified object w Array must be sorted into ascending

order according to natural ordering §  int binarySearch(Object[] a, Object key, Comparator c)

w Searches the specified object w Array must be sorted into ascending

order according to the specified comparator

Wrap-up §  The collections framework includes

interfaces and classes for containers §  There are two main families

w Group containers w Associative containers

§  All the components of the framework are defined as generic types