Cours de JAVA Quelques classes remarquables de JAVA Emmanuel ADAM Institut des Sciences et Techniques de Valenciennes Université de Valenciennes et du Hainaut-Cambrésis source principale : « Thinking in Java (B. Eckel) » Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 1 Quelques classes remarquables de JAVA Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 2 La classe Object Il s’agit de la classe principale, elle contient les fonctions : protected Object clone() qui crée et retourne une copie de l’objet boolean equals(Object obj) qui détermine si obj est égal à l’objet courant. protected void finalize() appelé par le ramasse miettes s’il n’y a plus de référence à l’objet Class getClass() retourne la classe courante de l’objet int hashCode() retourne une clé pouvant être utilisée pour un tri void notify() réveille un processus en attente sur l’objet void notifyAll() réveille tous les processus en attente String toString() retourne une chaîne représentant l’objet void wait() met en pause le processus courant en attendant un réveil Tous les objets Java héritent donc de ces méthodes Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 3 La classe String (1) Les chaînes sont constantes, leurs valeurs ne peuvent être changées après leurs créations. StringBuffer permet l’utilisation de chaînes "dynamiques". Construction : String str = "abc"; est équivalent à char data[] = {'a', 'b', 'c'}; String str = new String(data); La classe String comporte des méthodes d’accès aux caractères, de comparaisons, de recherche, d’extraction, de copie, de conversion minuscules/majuscule, ... Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 4 La classe String (2) L’opérateur (+) est surchargé pour permettre la concaténation, et à la conversion implicite d’objets en chaîne. Toute conversion se fait de manière automatique en faisant appel à la méthode toString() héritée de la classe Object. Il est donc possible de surcharger cette méthode dans les nouvelles classes créées. Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 5 La classe String (3) char charAt(int index) → retourne le caractère de la position index int compareTo(String anotherString) → compare la chaîne à une autre, en gérant les majuscules-minuscules. Retourne 0 en cas d’égalité, un entier négatif si la chaîne est inférieure à l’autre, et positif si la chaîne est supérieure à l’autre chaîne. int compareToIgnoreCase(String str) → idem que la précédente, mais ignore la case. String concat(String str) → ajoute la chaîne str à la fin de la chaîne. boolean endsWith(String suffix) → teste si la chaine se termine par le suffixe. boolean equals(Object anObject) → nécessaire pour comparer deux chaînes, traite la case. boolean equalsIgnoreCase(String anotherString) → idem, mais ignore la case. void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) → copie les caractères de la chaîne dans un tableau de caractères. int indexOf(int ch) → retourne l’index de la première occurrence du caractère. On trouve aussi int indexOf(int ch, int fromIndex) ; int indexOf(String str) et int indexOf(String str, int fromIndex) Ainsi que int lastIndexOf(int ch) ; int lastIndexOf(int ch, int fromIndex) ; int lastIndexOf(String str) ; int lastIndexOf(String str, int fromIndex) ;. int length() → retourne la longueur String replace(char oldChar, char newChar) → retourne une nouvelle chaîne après le remplacement de toutes les occurrences du caractère. boolean startsWith(String prefix) → teste si la chaîne commence par le préfixe. String substring(int beginIndex, int endIndex) → extrait une sous-chaîne. String toLowerCase() ; String toUpperCase() → change la case. String trim() → efface les espaces avant et après. Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 6 Des classes très utiles (import java.util.*) Interfaces : Collection, Comparator, Enumeration, EventListener, Iterator, List, ListIterator, Map, Map.Entry,Observer, Set, SortedMap, SortedSet Classes : AbstractCollection, AbstractList, AbstractMap, AbstractSequentialList, AbstractSet, ArrayList, Arrays, BitSet, Calendar, Collections, Date, Dictionary, EventObject, GregorianCalendar, HashMap, HashSet, Hashtable, LinkedList, ListResourceBundle, Locale, Observable, Properties, PropertyPermission, PropertyResourceBundle, Random, ResourceBundle, SimpleTimeZone, Stack, StringTokenizer, TimeZone, TreeMap, TreeSet, Vector, WeakHashMap Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 7 La classe Arrays Cette classe contient des méthodes statiques pour la gestion de tableaux : static int binarySearch(int []tab, int valeur) retourne l’index de la valeur, -1 si introuvable static boolean equals (boolean []tab1, boolean []tab2) static void fill (double []tab, double valeur) remplit le tableau avec la valeur static void fill (char []tab, int debut, int fin, char valeur) static void sort (long []tab) static void sort (short [] tab, int debut, int fin) s’appliquent à tous types de tableaux : d’entiers, de réels, d’objets (références seules prises en compte) Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 8 La classe Arrays int []tab = new int[100]; for(int i=0; i<tab.length; i++) tab[i] = (int)(Math.random()*100); String ch = ""; for(int i=0; i<tab.length; i++) ch = ch + tab[i] + ", "; System.out.println(ch); long tpsDebut = System.currentTimeMillis(); java.util.Arrays.sort(tab); long tpsFin = System.currentTimeMillis(); ch=""; for(int i=0; i<tab.length; i++) ch = ch + tab[i] + ", "; System.out.println(ch); 56, 95, 44, 59, 63, 48, 54, 82, 84, 7, 87, 82, 23, 15, 37, 0, 32, 27, 11, 77, 59, 46, 54, 63, 80, 72, 78, 43, 88, 97, 65, 91, 82, 20, 69, 18, 67, 91, 81, 22, 11, 36, 86, 96, 5, 36, 90, 66, 71, 50, 6, 6, 23, 46, 55, 41, 35, 69, 32, 50, 25, 64, 71, 82, 16, 13, 56, 65, 88, 1, 60, 76, 18, 52, 28, 27, 3, 45, 37, 87, 0, 31, 32,45, 25, 31, 59, 91, 28, 83, 78, 28, 4, 33, 40, 72, 48, 45, 44, 22, 0, 0, 1, 3, 4, 5, 6, 6, 7, 11, 11, 13, 15, 16, 18, 18, 20, 22, 22, 23, 23, 25, 25, 27, 27, 28, 28, 28, 31, 31, 32, 32, 32, 33, 35, 36, 36, 37, 37, 40, 41, 43, 44, 44, 45, 45, 45, 46, 46, 48, 48, 50, 50, 52, 54, 54, 55, 56, 56, 59, 59, 59, 60, 63, 63, 64, 65, 65, 66, 67, 69, 69, 71, 71, 72, 72, 76, 77, 78, 78, 80, 81, 82, 82, 82, 82, 83, 84, 86, 87, 87, 88, 88, 90, 91, 91, 91, 95, 96, 97, tri effectue en 0 millisecondes 1039728793720,1039728793720 System.out.println("tri effectue en " + (tpsFin - tpsDebut) + " millisecondes"); Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 9 La classe StringBuffer A utiliser si besoin de chaînes dynamiques (modifications, concaténation, …) int []tab = new int[10000]; for(int i=0; i<tab.length; i++) tab[i] = (int)(Math.random()*100); long tpsDebut = System.currentTimeMillis(); StringBuffer sb = new StringBuffer(); for(int i=0; i<tab.length; i++) sb.append(tab[i]).append(", "); Le gain de temps pour la création de la chaîne System.out.println(sb); représentant un tableau de 10000 entiers est ici de java.util.Arrays.sort(tab); sb = new StringBuffer(); for(int i=0; i<tab.length; i++) sb.append(tab[i]).append(", "); System.out.println(sb); long tpsFin = System.currentTimeMillis(); 20 sec environ !!! par rapport au code précédent (test sur java 1.5, Pentium 2.4 MHz) System.out.println("tri et affichage effectue en " + (tpsFin - tpsDebut) + " millisecondes"); Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 10 Autre fonctions sur les tableaux static void arraycopy(Object tabSource, int debutSource, Object tabDest, int debutDest, int longeur) est une méthode statique et native de la classe System à utiliser pour copier les tableaux. int []tab2 = new int[100]; System.arraycopy(tab, 0, tab2, 0, 100); Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 11 Vector La classe Vector est la plus utilisée. Elle permet de stocker des objets dans un ensemble de longueur variable. add (objet) permet d’ajouter un objet en queue, get(index) permet de récupérer l’objet positionné à l’index donné, find() permet de récupérer la position de l’objet, isEmpty() teste si le vecteur est vide, size() donne la taille du vecteur, toArray() retourne un tableau d’objets contenus dans le vecteur La classe ArrayList est l’identique de la classe Vector, mais n’est pas synchronisée, elle est donc plus rapide et à utiliser de préférence Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 12 Quelques classes de java.util La classe Stack hérite directement de la classe Vector et ajoute entre autres les méthodes : push(objet) : ajoute un objet en tête ; pop() : retire le premier objet ; peek() : renvoie une référence au premier objet sans le retirer ; empty() : teste si la pile est vide. Une pile peut aussi contenir des objets de différents types. Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 13 Quelques classes de java.util La classe Hashtable peut être vue comme un dictionnaire composé de deux vecteurs : un vecteur pour la clé et un vecteur pour l’objet. Une table de clés possède les méthodes : put(clé, objet) : get(clé) : containskey(clé) : containsvalue(objet) : : entre autres... isEmpty() Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 14 Quelques classes de java.util La classe Set définit un ensemble ne pouvant contenir qu’un exemplaire d’un objet. Cette classe dispose, entre autres, des méthodes : add(objet) qui n’ajoute l’objet que s’il n’est pas déjà présent contains(objet) ; remove(objet) ; isEmpty(). Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 15 Quelques classes de java.util L’interface Enumeration ne contient que deux méthodes : : retourne l’objet (à caster) courant et passe à l’élément suivant, hasMoreElements() : indique la présence d’au moins nextElement() un élément. Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 16 Quelques classes de java.util L’interface Enumeration (suite) utilisée surtout pour la lecture des éléments d’un vecteur : for(Enumeration e=vecteur.elements();e.hasMoreElements();) System.out.println((Personne)e.nextElement()) ; (mais elle est plus longue que get(index)) int taille = vecteur.size(); for(int i = 0; i<taille;i++) System.out.println((Personne)vecteur.get(i)) ; Remarque : elements() est la méthode qui retourne une énumération à partir du vecteur. Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 17 Trier les éléments d’une ArrayList (1/3) de la classe Collections permet de trier une liste d’objets implémentant l’interface Comparable. public static void sort (List list) si la classe des objets à trier n’implémente pas l’interface Comparable, il faut alors fournir un Comparator. Exemple de tri d’Integer dans une ArrayList : java.util.ArrayList al = new java.util.ArrayList(); for(int i=0; i<1000; i++) al.add(new Integer((int)(Math.random()*1000))); java.util.Collections.sort(al); // car une ArrayList implémente une List Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 18 Trier les éléments d’une ArrayList (2/3) /**Définition d’une classe implémentant l’interface Comparable : */ class Personne implements Comparable { String nom; private int noSecu; Personne(){nom = ""; noSecu = 0;} Personne(String _nom, int _noSecu){nom = _nom; noSecu = _noSecu;} public String toString() { return nom+":"+noSecu; } /**retourne –1 si objet<autre, 0 si objet = autre, 1 si objet > autre*/ public int compareTo(Object autre) { Personne p = (Personne)autre; return (nom.compareToIgnoreCase(p.nom)); } } Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 19 Trier les éléments d’une ArrayList (3/3) java.util.ArrayList al = new java.util.ArrayList(); for(int i=0; i<10; i++) al.add(new Personne("nom"+(int)(Math.random()*10), i)); String ch = ""; for(int i=0; i<al.size(); i++) ch = ch + (Personne)al.get(i) + ", "; System.out.println(ch); java.util.Collections.sort(al); ch = ""; for(int i=0; i<al.size(); i++) ch = ch + (Personne)al.get(i) + ", "; System.out.println(ch); nom6:0, nom8:1, nom2:2, nom4:3, nom0:4, nom8:5, nom2:6, nom2:7, nom8:8, nom9:9, nom0:4, nom2:2, nom2:6, nom2:7, nom4:3, nom6:0, nom8:1, nom8:5, nom8:8, nom9:9, Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 20