Plan Chaînes de caractères un exemple d objet Définition Programmation objet Classe String Classe StringBuilder Université de Nice - Sophia Antipolis Richard Grin Version1.1 10/11/11 Richard Grin Chaînes de caractères page 2 Définition Une chaîne de caractères est une suite de caractères lisibles par un homme Très utilisé dans les programmes informatiques, par exemple pour afficher des informations, désigner un fichier, recevoir un nom d utilisateur, afficher les options d un menu Codage Unicode Les caractères utilisés par Java sont codés par le codage Unicode Unicode peut représenter tous les caractères affichables de toutes les langues (ou presque ), les caractères de ponctuation et même les caractères utilisés par les mathématiques ou d autres domaines La version actuelle du codage Unicode est la version 5 qui code plus d un million de caractères Richard Grin Chaînes de caractères page 3 Richard Grin Chaînes de caractères page 4 Programmation objet Programmation objet Jusqu à maintenant dans cette introduction à la programmation nous n avons pas fait de programmation objet La programmation objet manipule des objets Elle modélise la réalité concernée par le programme à l aide d objets Richard Grin Chaînes de caractères page 5 Richard Grin Chaînes de caractères page 6 1
Qu est-ce qu un objet? Entité identifiable, concrète ou abstraite Un objet réagit à des messages qu on lui envoie ; la façon dont il réagit constitue le comportement de l objet Il ne réagit pas toujours de la même façon à un même message ; sa réaction dépend de l état dans lequel il est Comportement État (caché) (interface publique) Un objet Un objet Arrête-toi vitesse direction... va à x km/h Une voiture Démarre R. Grin Introduction à Java 7 R. Grin Introduction à Java 8 Exemples d objet Une voiture Un employé Un client Une facture Une chaîne de caractères Interactions entre objets Les objets interagissent en s envoyant des messages Objet qui reçoit le message Message envoyé objet1.decristoi(); employe.valeurdetonsalaire(2000); Paramètre du message Richard Grin Chaînes de caractères page 9 R. Grin Introduction à Java 10 nom:pierre âge:28 ans... Pierre Messages entre objets Conduit à la ville v Pierre envoie un message à sa voiture : va à 70 km/h arrête-toi va à x km/h démarre vitesse:60 direction:5... La voiture de Pierre mavoiture.vaavitesse(70); R. Grin Introduction à Java 11 Notion de classe Le code lié aux objets d un même type est écrit dans une classe Par exemple, les objets Pierre, Paul et Jacques sont représentés par la classe Personne La classe contient le code qui décrit l état et le comportement des objets qui sont de ce type Richard Grin Chaînes de caractères page 12 2
Les classes en Java L état interne est donné par les valeurs des variables d instance Le comportement est donné par les méthodes Par exemple, la classe Personne contient le code qui décrit les variables d instance et les méthodes applicables aux personnes Méthodes et messages Méthodes de la classe d un objet messages qu on peut lui envoyer Quand un objet reçoit un message, il exécute la méthode correspondante R. Grin Introduction à Java 13 R. Grin Introduction à Java 14 Paradigme objet La programmation objet est un paradigme, une manière de «modéliser le monde» : des objets ayant un état interne et un comportement collaborent en s échangeant des messages pour fournir les fonctionnalités qu on demande à l application Classe String R. Grin Introduction à Java 15 Richard Grin Chaînes de caractères page 16 Classe String Le développeur peut créer ses propres types d objet Il peut aussi manipuler des types d objets créés par d autres Pour cette partie du cours nous allons étudier les chaînes de caractères, objets fournis en standard par le JDK de Java sous la forme de la classe java.lang.string Extrait de String.java /** The value is used for character storage.*/ private final char[] value; /** The count is the number of characters in the String. */ private final int count; dans src.zip Richard Grin Chaînes de caractères page 17 Richard Grin Chaînes de caractères page 18 3
Types en Java Les classes peuvent servir de type (pour déclarer les variables ou dans les signatures des méthodes), comme les types primitifs Les types que l on a déjà vu : Types primitifs (int, double, ) Classes (String par exemple) Tableaux (int[] ou String[] par exemple) D autres sortes de types seront étudiées dans le cours de L3 Création d un objet String En Java, la syntaxe normale pour la création d un objet utilise le mot clé new, comme pour un tableau : Train train = new Train(125); La classe String a une syntaxe spéciale String = "Bonjour"; crée un objet String et l affecte à la variable Comme pour les tableaux, l objet String est entreposé dans le tas (pas dans la pile) Richard Grin Chaînes de caractères page 19 Richard Grin Chaînes de caractères page 20 = "Bonjour"; String dans le tas Vocabulaire Un objet de la classe String (ou de toute autre classe) s appelle une instance de la classe Bonjour Pile Tas Richard Grin Chaînes de caractères 21 Richard Grin Chaînes de caractères page 22 Un objet String n est pas modifiable La classe String est une classe particulière car il est impossible de modifier l état des instances de la classe Il existe dans le JDK la classe StringBuilder pour représenter les chaînes de caractères modifiables ; elle sera étudiée à la fin de cette section Nouvelle affectation avec les String String = "Bonjour"; = "Hello"; Cet objet String n est pas modifié La dernière instruction correspond aux étapes suivantes : 1) Une nouvelle valeur (Hello) est créée 2) La variable référence la nouvelle chaîne Hello (et plus l ancienne chaîne Bonjour) 3) La place occupée par la chaîne Bonjour pourra être récupérée à un moment ultérieur par le ramasse-miette Richard Grin Chaînes de caractères page 23 Richard Grin Chaînes de caractères 24 4
= "Bonjour"; = "Hello"; String dans le tas = "Bonjour"; = "Hello"; String dans le tas Hello Plus tard le ramasse-miette viendra libérer la place occupée par «Bonjour» Bonjour Bonjour Pile Tas Richard Grin Chaînes de caractères 25 Pile Tas Richard Grin Chaînes de caractères 26 Concaténation de chaînes String s = "Bonjour" + " les amis"; Si un des 2 opérandes de l opérateur + est une String, l autre est traduit automatiquement en String : int x = 5; s = "Valeur de x = " + x; Concaténation de chaînes S il y a plusieurs + dans une expression, les calculs se font de gauche à droite int x = 5; s = "Valeur de x + 1 = " + x + 1; s contient «Valeur de x + 1 = 51» s = x + 1 + "est la valeur de x + 1"; s contient «6 est la valeur de x + 1» On peut utiliser des parenthèses pour modifier l ordre d évaluation : s = "Valeur de x + 1 = " + (x + 1); Richard Grin Chaînes de caractères 27 Richard Grin Chaînes de caractères 28 Égalité de Strings La méthode equals teste si 2 instances de String contiennent la même valeur : String s1, s2; s1 = "Bonjour "; s2 = "les amis"; if ((s1 + s2).equals("bonjour les amis")) System.out.println("Egales"); «==» teste si 2 objets sont les mêmes ; il ne doit pas être utilisé pour comparer 2 chaînes Richard Grin Chaînes de caractères 29 Méthodes d instance La méthode equals (comme les autres méthodes de la classe String) n est pas une méthode static (voir javadoc) Elle correspond à un message envoyé à un objet (pas à une classe) Les méthodes static sont appelées des méthodes de classe ; les autres sont appelées des méthodes d instance La plupart des méthodes sont des méthodes d instance Richard Grin Chaînes de caractères page 30 5
Comparaison de Strings s.compareto(t) renvoie le «signe de s-t» : 0 en cas d égalité de s et de t, un nombre entier positif si s suit t dans l ordre lexicographique un nombre entier négatif sinon Méthodes de String Il est impossible de connaître toutes les méthodes des classes fournies par le JDK Il faut se renseigner en utilisant la javadoc de la classe Richard Grin Chaînes de caractères 31 Richard Grin Chaînes de caractères page 32 Exemples de méthodes de String Récupérer le protocole, la machine, le répertoire et le nom du fichier d une adresse Web http://truc.unice.fr/rep1/rep2/fichier.html int n = adresse.indexof(":"); // 4 String protocole = adresse.substring(0, n); // http String reste = adresse.substring(n + 3); n = reste.indexof("/"); // 13 rep1/rep2/fichier.html String machine = reste.substring(0, n); String chemin = reste.substring(n + 1); int m = chemin.lastindexof("/"); // 9 String repertoire = chemin.substring(0, m); String fichier = chemin.substring(m + 1); Richard Grin Chaînes de caractères 33 A retenir Aucune des méthodes de la classe String ne modifie la chaîne qui reçoit le message Par exemple, substring extrait une souschaîne qui est retournée par la méthode mais la chaîne qui reçoit le message n est pas modifiée Richard Grin Chaînes de caractères page 34 Chaînes de caractères 2 classes du paquetage java.lang : Classe StringBuilder String pour les chaînes constantes StringBuilder pour les chaînes variables On utilise le plus souvent String, sauf si la chaîne doit être fréquemment modifiée Richard Grin Chaînes de caractères page 35 Richard Grin Chaînes de caractères 36 6
Chaînes modifiables StringBuilder possèdent des méthodes qui modifient le receveur du message et évitent la création de nouvelles instances ; par exemple : append insert replace delete Attention, StringBuilder ne redéfinit pas equals Pour comparer le contenu de 2 StringBuilder le plus simple est de les transformer en String pour utiliser equals Richard Grin Chaînes de caractères 37 Exemple StringBuilder sb = new StringBuilder("Personne"); sb.append(s); sb.insert(0, "8 "); Richard Grin Chaînes de caractères page 38 String et StringBuilder Utiliser plutôt la classe String qui possède de nombreuses méthodes Si la chaîne de caractères doit être souvent modifiée, passer à StringBuilder avec le constructeur StringBuilder(String s) Repasser de StringBuilder à String avec tostring() Concaténation - performances La concaténation de Strings est une opération coûteuse (elle implique en particulier la création d un StringBuilder) Passer explicitement par un StringBuilder si la concaténation doit se renouveler Richard Grin Chaînes de caractères 39 Richard Grin Chaînes de caractères 40 Exemple String[] t;... // Remplit t // Création de l instance de StringBuilder StringBuilder sb = new StringBuilder(t[0]); // Concaténation des éléments de t dans sb // (évite des créations d objets) for (int i = 1; i < t.length; i++) { sb.append(t[i]); } // Récupère le résultat dans une String String = c.tostring(); Richard Grin Chaînes de caractères 41 7