Collections&Generics

42
Collections & Generics, une introduction Par Didier Besset [email protected] Hortis GRC SA - www.hortis.ch

description

Presentation du chapttre 7 de la certification Java, donnée les 28 mars et 2 avril 2009

Transcript of Collections&Generics

Page 1: Collections&Generics

Collections & Generics,une introduction

Par Didier [email protected]

Hortis GRC SA - www.hortis.ch

Page 2: Collections&Generics

2

Iterator<T> hasNext()next()remove()

Collection interface

Collections & Generics Hortis GRC SA - www.hortis.ch

Collection <T>add(T)addAll(Collection<T>)remove(T)removeAll (Collection<T>)retainAll (Collection<T>)clear()contains(T)containsAll(Collection<T>)isEmpty()size()toArray()iterator()

Iterable<T> iterator()

Page 3: Collections&Generics

3 Hortis GRC SA - www.hortis.ch

Utilisation d’un Iterable

Seule façon d’accéder au contenu d’une collection quelconque: for( final T item: collection) { ... faire quelque chose... }

Collections & Generics

Page 4: Collections&Generics

4

Utilisation d’un Iterator

Seule façon d’accéder et de modifier le contenu d’une collection quelconque:final Iterator<T> iter =

collection.iterator();

while(iter.hasNext()) {

final T item = iter.next();

... faire quelque chose...

if (... condition...) {

iter.remove();

}

}Collections & Generics Hortis GRC SA - www.hortis.ch

Page 5: Collections&Generics

5

Utilisation d’un Iterator dans un “for”

Le contenu reste identique:for(final Iterator<T> iter =

collection.iterator();iter.hasNext();) {

final T item = iter.next();

... faire quelque chose...

if (... condition...) {

iter.remove();

}

}

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 6: Collections&Generics

6

Comparable

Donne un ordre “naturel”:Interface Comparable<T> {

int compareTo(T o);

}

Exemple pour une liste:final List<T extends Comparable<T>>

myList = ...

Collections.sort(myList);

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 7: Collections&Generics

7

Comparator

Pour mettre de l’ordre dans les collections:Interface Comparator<T> {

int compare(T o1, To2);

}

Exemple pour une liste:final List<T> myList = ...

final Comparator<T> myComparator = ...

Collections.sort(myList, myComparator);

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 8: Collections&Generics

8

Lists and Sets

Une liste possède un ordre, Un Set ne contient aucun doublon.

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 9: Collections&Generics

9

Lists and Sets

Collections & Generics Hortis GRC SA - www.hortis.ch

Collection<T>

List<T>get(int)remove(int)add(int,T)set(int,T)indexOf(T)lastIndexOf(T)subList(int,int)

Set<T>

SortedSet<T> comparator()first()last()subSet(T,T)headSet(T)tailSet(T)

Page 10: Collections&Generics

10

Maps

Permet un accès indexé par n’importe quel object: “buckets” adressés par le hashCode, Séparation à l’intérieur d’un “bucket” à l’aide de la

méthode equals .

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 11: Collections&Generics

11

Maps

Collections & Generics Hortis GRC SA - www.hortis.ch

Collection<T>

Map<K,T>put(K,T)putAll(Map<K,T>)remove(K)get(K)clear()size()containsKey(K)containsValue(T)keySet()values()

Set<K>

SortedMap<K,T> comparator()firstKey()lastKey()subMap(K,K)headMap(K)tailMap(K)

Page 12: Collections&Generics

12

Synchronization

Collections & Generics Hortis GRC SA - www.hortis.ch

Collection type

Synchronized object factory

Collection synchronizedCollection()

List synchronizedList()

Set synchronizedSet()

SortedSet synchronizedSortedSet()

Map synchronizedMap()

SortedMap synchronizedSortedMap()

Page 13: Collections&Generics

13

Full collection hierachy

Collections & Generics Hortis GRC SA - www.hortis.ch

AbstractCollection

AbstractList AbstractSet

ArrayList Vector HashSet TreeSet

Collection

Set

SortedSet

List

AbstractSequentialList

LinkedListStack

AbstractQueue

Page 14: Collections&Generics

14

Full Map hierachy

Collections & Generics Hortis GRC SA - www.hortis.ch

AbstractMap

HashMap TreeMap

SortedMap

Map

WeakHashMap

Hashtable

Dictionary

Page 15: Collections&Generics

15

Boxing and auto-boxing

Une Collection ou une Map contient des objects, pas des primitives,

Usage correct (boxing explicite) :Collection<Integer> measures = ...;

measures.add(new Integer(4));

Usage permis (boxing implicite) :measures.add(4);

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 16: Collections&Generics

16

Convertions

Arrays → Listes :MyClass[] myArray = ...;

Collection<MyClass> measures = Arrays.asList(myArray);

Listes → Arrays :

Collection<MyClass> measures = ...;

MyClass[] myArray = measures.toArray(

new MyClass[measures.size()]);

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 17: Collections&Generics

17

“Backed” collections

Une “feature” dangereuse des collections construites sur des Map:

Collections & Generics Hortis GRC SA - www.hortis.ch

keySet() tailset()

values() tailmap()

headset() subSet()

headmap() subMap()

Page 18: Collections&Generics

18

keySet() tailset()

values() tailmap()

headset() subSet()

headmap() subMap()

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 19: Collections&Generics

19

Déclarations générique

Déclaration pour le compilateur seulement, Le type “générique” n’a pas d’existence dans

la machine virtuelle, Un type se déclare au niveau:

de la classe, d’une méthode (non-static ou static);

Il s’agit donc d’un simple “pattern-matching”

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 20: Collections&Generics

20

Différences fondamentale

Les arrays ont accès à l’héritage:Number[] measures = new Integer[4];

Les collections pas!List<Number> measures =

new ArrayList<Integer>();

... parce que le type de la déclaration de la collection n’existe pas en dehors du compilateur.

Collections & Generics Hortis GRC SA - www.hortis.ch

Faux!!

Page 21: Collections&Generics

21

Comment faire?

On utilise la notation <? extends xxx>, Par exemple :

List<? extends Number> measures =new ArrayList<Integer>();

Par contre :Number meter = measures.get(0);

Integer mm = measures.get(1);

Collections & Generics Hortis GRC SA - www.hortis.ch

(Integer)

Page 22: Collections&Generics

22

Exemple: filtre générique

Collections & Generics Hortis GRC SA - www.hortis.ch

public abstract class AbstractObjectFilter<T> {

private final EventListenerList listenerList = new EventListenerList();

public void addChangeListener(ChangeListener listener) {listenerList.add(ChangeListener.class, listener);

}

public void removeChangeListener(ChangeListener listener) {listenerList.remove(ChangeListener.class, listener);

}

protected void fireChanged() {final ChangeEvent event = new ChangeEvent(this);final Object[] listeners = listenerList.getListenerList();for (int i = listeners.length - 2; i >= 0; i -= 2) {

if (listeners[i] == ChangeListener.class) { ((ChangeListener) listeners[i + 1]).stateChanged(event);}

}}

public abstract boolean accept(T object);}

Page 23: Collections&Generics

23

Exemple: utilisation filtre

Collections & Generics Hortis GRC SA - www.hortis.ch

public boolean collect(List<D> adaptedObjects, IObjectListModel<? extends D> model) {

final boolean added = false;for (final D object : model) {

if (filter.accept(object)) {adaptedObjects.add(object);

}}return added;

}

Page 24: Collections&Generics

24

Exemple: binding sur une sous-classe

Collections & Generics Hortis GRC SA - www.hortis.ch

public class WayPointDifferentiator extends AbstractNamedAdaptationDataDifferentiator<WayPoint> {

public final static WayPointDifferentiatorinstance = new WayPointDifferentiator();

private WayPointDifferentiator() {super();

}

@Overridepublic boolean equals(final WayPoint o1, final WayPoint o2) {

return super.equals(o1, o2) && (o1 == null || valueEquals(o1.getArea(), o2.getArea()));

}

@Overridepublic Class<WayPoint> getObjectClass() {

return WayPoint.class;}

@Overrideprotected void collectAccessors(ArrayList<String> accessorList) {

super.collectAccessors(accessorList);accessorList.add("ShortName");accessorList.add("Wgs84Latitude");accessorList.add("Wgs84Longitude");

}}

Page 25: Collections&Generics

25

Exemple: binding sur une méthode

Collections & Generics Hortis GRC SA - www.hortis.ch

public abstract class AbstractAdaptationData<T>implements Serializable, IVersionable<T>, Comparable<T> {

public static <D extends Comparable<D>> int compare(final D v1, final D v2) {if (v2 == null) {

return v1 == null ? 0 : 1;} else if (v1 == null) {

return -1;}return v1.compareTo(v2);

}

Page 26: Collections&Generics

26

Exemple: binding sur une méthode

Collections & Generics Hortis GRC SA - www.hortis.ch

public <T extends AbstractAdaptationData<T>> void loadDescriptorData(final AdaptationDataManager manager,final AdaptationDataRepository dataRepository, final AbstractAdaptationDataDescriptor<T> _descriptor,final SubtableController _subtableController, final T selectedObject, final boolean activateSearchField) {

setName(_descriptor.getName());final ObjectTableModel<T> tableModel =

_descriptor.getTableModel(manager, selectedObject);tableModel.setResourceBundle(manager.getResourceBundle());table = new JTableWithToolTips(tableModel);table.setName(_descriptor.getName());final String searchColumn = _descriptor.getSearchColumn();MutableDynamicTableFilter<T> dynamicTableFilter = null;MutableDynamicTableSorter<T> dynamicTableSorter = null;final DefaultColumnFilterFactory<T> filterFactory =

_descriptor.getFilterFactory(manager);

Page 27: Collections&Generics

27

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 28: Collections&Generics

28

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 29: Collections&Generics

29

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch

ClassCastException

Page 30: Collections&Generics

30

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 31: Collections&Generics

31

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 32: Collections&Generics

32

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 33: Collections&Generics

33

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 34: Collections&Generics

34

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 35: Collections&Generics

35

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 36: Collections&Generics

36

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 37: Collections&Generics

37

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 38: Collections&Generics

38

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 39: Collections&Generics

39

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 40: Collections&Generics

40

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 41: Collections&Generics

41

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch

Page 42: Collections&Generics

42

Questionaire

Collections & Generics Hortis GRC SA - www.hortis.ch