Accueil
Java Standard Edition
Java EE 5
Visual Basic .Net 2005
Visual C++ .Net 2005
Visual C# .Net 2005
Cours ASP .Net 2.0
Postgresql
Linux
Visual Studio 2008
ASP 3.0 Classique
Cours Javascript - DOM - DHTML
Cours Ajax
VBA
Assembleur
Perl
Membres
L'auteur du site
Nouveautés sur le site
Contacts
Plan du site
Exécution d'un programme
Les archives Jar
Les classes abstraites
Les interfaces
Les tableaux
La généricité
Les énumérations
Les classes internes
Classes anonymes et internes locales
Les threads: généralités
Les threads(2): synchronisation
E/S(1):InputStream et OutputStream
E/S(2):FileInputStream et FileOutputStream
E/S(3):Reader et Writer
E/S(4):FilterInputStream et FilterOutputStream
E/S(5):Les filtres d'octets: PrintStream
E/S(6):Les filtres d'octets: DataInputStream et DataOutputStream
E/S(7):Les filtres d'octets: BufferedInputStream et BufferedOutputStream
E/S(8):Flux de caractères: PrintWriter
E/S(9):Flux de caractères: FilterReader et FilterWriter
E/S(10):Flux de caractères: InputStreamReader, OutputStreamWriter, StreamDecoder, StreamEncoder
E/S(11):Flux de caractères: BufferedReader et BufferedWriter
E/S(12):Flux de caractères: FileReader et FileWriter
La classe String (java.lang)
Les collections: L'interface Collection(java.lang)
Les collections(2): L'interface List(java.util)
Les collections(3): AbstractCollection(java.util)
Les collections(4): AbstractList(java.util)
Les collections(5): Vector(java.util)
Les collections(6): L'interface Map(java.util)
Les collections(7): AbstractMap(java.util)
Les collections(8): HashMap(java.util)
La bibliothèque Swing en Java
Les bases de données en Java
JDBC ( Java Database Connectivity )
Les interfaces graphiques
Les fichiers de configuration en Java
INSTALLATION JAVA EE 5, JRE 6, ECLIPSE, TOMCAT, ETC SOUS LINUX
INSTALLATION JAVA EE 5, JRE 6, ECLIPSE, TOMCAT, ETC SOUS WINDOWS
Les applications Web en java
Les filtres Java (javax.servlet.Filter)
I Généralités
I.1 Le formulaire principal
I.2 Les objets créés par Visual
I.3 Les variables références
I.4 Le garbage collector
II Créer évènements
II.1 Rappel évènements
II.2 Procédure à suivre
II.2.1 Créer son EventArgs
II.2.2 Créer EmetEvent
II.2.3 Déclarations autres
I Généralités
I.1 Applications winforms
I.2 Applications MFC
I.3 Objets managés ou pas
I.4 Objets non managés
I.5 Objets managés - handle
I.6 Le top-level ^
II Créer évènements
II.1 Rappel évènements
II.2 Procédure à suivre
II.2.1 Créer son EventArgs
II.2.2 Créer EmetEvent
II.2.3 Déclarations autres
I Généralités
I.1 Puissant et Accessible
I.2 Créer ses classes
II Créer évènements
II.1 Rappel évènements
II.2 Procédure à suivre
III Les services Windows
IV Le .net remoting
V Communication Tcp avec TcpClient et TcpListener
II.2.1 Créer son EventArgs
II.2.2 Créer EmetEvent
II.2.3 Déclarations autres
I Généralités
I.1 Un EDI formidable
I.2 Inclure C# ou VB
I.3 L'objet Response
I.4 Les évènements
II ASP .net et les bdd
II.1 Essayer plusieurs fois la requête
I 2.1 Fichiers distincts
I.2.2 Avec la balise script
I.2.3 Inclure réellement
I.2.4 Avec Response.Write()
I.3.1 La méthode Response.Redirect()
I.4.1 Résoudre problème post
Installation Postgre Linux
Cours Postgresql
Le Shell Unix( Linux, Ubuntu)
Les scripts C-Shell
Programmation système Unix
Reseau Linux
Les iptables
Windows Presentation Foundation(WPF)
Le Framework 3.0
Windows Workflow Foundation(WF)
ASP 3.0 Classique
Cours Javascript - DOM - DHTML
Chat Ajax
VBA Excel 2003
Assembleur
Perl
Inscription
Liste membres
Livre d'or
Forum
Accueil
>
Java Standard Edition
>
Les collections(6): L'interface Map(java.util)
____________________________________________________________________________________________________
Connexion
Les collections(6): L'interface Map (java.util)
Sommaire :
I) Généralités
II) L'interface Map (java.util)
II-1) Les membres de Map
II-1-A) Les méthodes de Map
II-1-B) L'interface Map.Entry
I) Généralités
Dans le chapitre sur le framework des collections, nous avons appris que Map est une des six interfaces du framework de collections.
En résumé,
Map est un ensemble de paires clé/valeur. Chaque clé est unique, et ne peut mapper au plus qu'une valeur.
Certaines implémentations ont des restrictions sur les clés et les valeurs autorisées. Par exemple Hashtable, qui n'autorise pas de null pour les clés et valeurs; par contre HashMap n'impose pas de contraintes.
Trois méthodes permettent d'avoir trois vues de collection. Une permet d'obtenir une collection des valeurs.
La deuxième permet d'avoir un Set des clés. Enfin la troisième nous donne un Set des entrées, une entrée étant un objet représentant une paire clé/valeur.
II) L'interface Map (java.util)
public interface Map<K,V>
C'est une interface générique, à deux paramètres de généricité.
II-1) Les membres de Map
II-1-A) Les méthodes de Map
hormis les trois méthodes donnant trois vues de la map, les autres méthodes sont classiques pour une telle collection de mapping clé/valeur.
int size();
Retourne le nombre de mapping clé-valeur de la map. A noter que si la map contient plus de Integer.MAX_VALUE éléments, elle retourne Integer.MAX_VALUE.
boolean isEmpty();
Retourne true si la map n'a aucune paire clé/valeur.
boolean containsKey(Object key);
Retourne vrai si la map contient la clé. C'est à dire si la map contient un mapping pour une clé k, tel que key.equals(k) est vrai. Ou alors si key est null, si la map contient un mapping avec une clé k qui est null. On remarque que null pour une clé (quand cela est permis par la map), est considéré comme une valeur ordinaire, et donc doit être unique, comme toute clé.
boolean containsValue(Object value);
Retourne vrai si la map contient au moins une valeur value. C'est à dire si la map contient au moins une valeur v, telle que value.equals(v).
Ou alors si value est null, si la map contient au moins une valeur null
V get(Object key);
Retourne la valeur mappée à la clé, ou null si la map ne contient pas de valeur mappée à cette clé. Si key est null, recherche l'entrée dont la clé vaut null.
Si la map permet les valeurs null, alors un résultat null de get, ne permet pas de savoir si la clé est présente ou non. Dans ce cas, un appel à containsKey auparavant, permet de résoudre le problème. En effet, par exemple si 5 est mappé à la valeur null, containsKey donnera true pour la clé 5, on pourra être certain alors que le résultat du get signifie que la valeur associée est null.
Par contre, pour une clé 4 inexistante, containsKey retournera false, on ne réalisera pas alors de get.
V put(K key, V value);
Opération optionnelle (UnsupportedOperationException sinon). Associe la valeur à la clé spécifiée. Si la clé est déjà présente, alors l'ancienne valeur est remplacée par la nouvelle.
V remove(Object key);
Opération optionnelle (UnsupportedOperationException sinon). Supprime le mapping pour la clé spécifiée, si la clé est présente.
void putAll(Map extends K, ? extends V> m);
Opération optionnelle (UnsupportedOperationException sinon). Permet de copier tous les mappings de la map en paramètre, vers la notre. C'est comme si on avait effectué un put(k, v), pour tous les mappings de la map en argument.
Le comportement est indéfini si la map à copier est modifiée en cours de progression.
void clear();
Opération optionnelle (UnsupportedOperationException sinon). Permet de supprimer tous les mappings de notre map, qui sera vide à la fin.
Set
keySet();
keySet permet d'obtenir une vue de collection de notre map, vue qui est ici un Set de clés. En effet, comme les clés sont uniques, elles peuvent former un Set, qui, par définition, et un ensemble d'éléments uniques. On obtient une collection qui ne s'intéresse qu'aux clés( on obtient un jeu de clés!), et qui ne contient pas les valeurs de la map.
Collection
values();
values permet d'obtenir une collection contenant toutes les valeurs. C'est une vue de collection de la map.
Set
> entrySet();
Permet d'obtenir une vue de collection de notre map, vue qui est ici un Set d'entrées(Map.Entry). En effet, chaque entrée est unique, puisque chaque clé est unique. On peut donc réaliser un Set d'Entry, car on n'aura jamais deux Entry ayant la même clé et la même valeur. Cette méthode entrySet permet d'obtenir un tel Set.
boolean equals(Object o);
Compare l'égalité de l'objet en paramètre, avec notre map. Pour cela, il faut que l'objet o soit une map, et que les deux maps aient les mêmes mappings. Une façon de l'écrire formellement est:
m1.entrySet().equals(m2.entrySet()) . Les deux jeux d'entrées sont égaux dans ce cas.
int hashCode();
Retourne la valeur hashcode pour notre map.
Revoyons ce que nous avions dit sur le hashcode, dans le cours sur la classe String. Il me semble intéressant de redéfinir le hashcode ici, car ce principe est utilisé dans des maps comme HashMap ou Hashtable.
Je profite donc de la méthode hashcode() de l'interface Map, pour parler du hashcode.
Le hash code est une valeur entière, qui permet de nous aider à tester rapidement que deux objets(d'une même classe) sont égaux. Deux objets sont égaux, si leurs méthodes hashCode retourne le même entier, et ensuite on doit appeler leur méthode equals. Deux objets peuvent avoir le même hashcode, et les deux objets ne pas être égaux. Mais deux objets ne peuvent pas être égaux, si leur hashcode est différent.
Cela permet de comparer des objets plus rapidement. La classe doit implémenter une méthode int hashCode(), qui soit la plus appropriée possible, un compromis entre la rapidité de réponse, et la capacité à être précise du point de vue égalité. Par exemple, pour deux objets Personne, on peut imaginer une méthode hashCode qui sera une fonction des deux dates de naissance, et de la première lettre du nom de famille( c'est un exemple!).
Le hashcode est utilisé notamment dans des classes comme HashTable (java.util), pour comparer les clés. Dans ces classes, il est à noter que pour toutes les clés de la hash table, le hashcode est calculé une fois pour toutes à l'insertion de la paire clé/valeur. Ce qui signifie qu'à chaque recherche de clé, il n'y a que le hashcode de la clé à rechercher, qui est à calculer.
Il ne nous reste plus ensuite qu'à le comparer avec les hash codes déjà calculés.
La performance de la méthode hashCode() est donc moins importante ici; et sa précision présente plus d'intérêt ( c'est à dire diminuer le nombre d'objets ayant le même hashcode), afin de diminuer les appels à equals pour les objets ayant le même hash code.
Note: en réalité, l'implémentation des hash tables est un peu plus complexe que cela. Car on profite du hash code pour en déduire(avec une valeur absolue, puis un modulo de la taille du tableau) un index dans un tableau de listes chaînées, qui sont chacune une liste chaînée de paires clé/valeur possibles(ça limite la recherche, mais toutes n'ont pas forcément le même hash code). Mais le principe reste tout-à-fait celui qu'on a énoncé.
II-1-B) L'interface Map.Entry
interface Entry
C'est une public static interface, qui est déclarée à l'intérieur de l'interface Map. Il y a juste "interface", mais, sous-entendu, elle est public, et static.
On y accède donc par Map.Entry
En résumé, on dit qu'une entrée (Entry) représente une paire clé/valeur. Elles sont utilisées par la méthode Map.entrySet, qui retourne un Set de Entry. On précise aussi que les Entry obtenues par l'itérator ne sont pas mises à jour automatiquement suivant les modifications qu'on ferait à la map après.
Regardons les méthodes:
K getKey();
Retourne la clé correspondante à l'entrée. Une IllegalStateException peut, mais ce n'est pas obligé, être déclenchée si l'entrée a été supprimée de la map sous-jacente.
V getValue();
Retourne la valeur correspondante à l'entrée. Une IllegalStateException peut, mais ce n'est pas obligé, être déclenchée si l'entrée a été supprimée de la map sous-jacente.
V setValue(V value);
Opération optionnelle (UnsupportedOperationException sinon). permet de remplacer la valeur de notre entrée, par une autre valeur. La map sous-jacente est affectée en conséquence. Le comportement est indéfini si l'entrée a été supprimée de la map( par le remove de l'itérateur du Set retourné par entrySet).
Une IllegalStateException peut, mais ce n'est pas obligé, être déclenchée si l'entrée a été supprimée de la map sous-jacente.
boolean equals(Object o);
Retourne vrai si l'Object o est aussi une map entry, et si c'est la même entrée, c'est à dire la même clé et la même valeur.
int hashCode(); Le hashcode d'une map entry est défini ainsi: (e.getKey()==null ? 0 : e.getKey().hashCode()) ^ (e.getValue()==null ? 0 : e.getValue().hashCode())
L'opérateur ^ est le XOR logique(bit à bit).
Exemple d'implémentation de hashCode() d'une map entry:
!!!Vient de la classe statique HashMap.Entry!!! public final int hashCode() { return (key==null ? 0 : key.hashCode()) ^ (value==null ? 0 : value.hashCode()); }
La méthode hashCode() d'une map entry n'est, à ma connaissance, pas utilisée pour les recherches d'entrées dans les hash maps(par exemple, elle n'est pas utilisée dans HashMap). C'est compréhensible, car on a besoin, à partir d'une clé, de savoir si l'entrée est présente, et non à partir d'une entrée.
RETOUR HAUT