Programmation Java/Chaînes de caractères
Une chaîne de caractères (type String) représente une séquence ordonnée de caractères (char).
Le type java.lang.String est définie par une classe dérivée de java.lang.Object.
Syntaxe
[modifier | modifier le wikicode]Les valeurs littérales de chaînes de caractères utilisent les guillemets " pour encadrer la séquence de caractères.
Exemple :
String titre = "Chaînes de caractères en Java";
Encodage
[modifier | modifier le wikicode]Une chaîne de caractères contient un tableau de caractères dont chaque élément est de type char, donc sur 16 bits (0x0000 à 0xFFFF).
L'encodage en mémoire est donc l'UTF-16.
Les caractères peuvent être spécifiés par leur point de code Unicode en hexadécimal après le préfixe \u.
Exemple :
String titre = "Le caractère \u4f60 appartient au bloc Unicode nommé 'CJK Unified Ideographs'";
Il est également possible d'utiliser directement le caractère si le fichier source Java est encodé en UTF-8 ou UTF-16 :
String titre = "Le caractère 你 appartient au bloc Unicode nommé 'CJK Unified Ideographs'";
L'intervalle des points de code Unicode est cependant plus large que les 16 bits supportés par le type char : U+000000 à U+10FFFF.
Les points de code du plan de base (BMP : Basic Multilingual Plane) de U+000000 à U+00FFFF sont directement utilisables avec le type char.
Au delà de cet intervalle, il faut utiliser deux caractères (surrogates pair) pour encoder le point de code.
La classe java.lang.Character possède des méthodes pour générer ces deux caractères.
L'exemple suivant est une méthode retournant une chaîne de caractères pour représenter un point de code Unicode particulier :
public static String getStringForCodePoint(int codepoint) // U+000000 à U+10FFFF
{
return codepoint<0x10000 ?
""+(char)codepoint : // Basic Multilingual Plane (U+000000 à U+00FFFF)
""+Character.highSurrogate(codepoint)+Character.lowSurrogate(codepoint); // (U+010000 à U+10FFFF)
// EQV: ""+(char)(0xD800|((codepoint-0x10000)>>>10))+(char)(0xDC00|(codepoint&0x3FF));
}
Manipulations
[modifier | modifier le wikicode]Les chaînes de caractères sont représentées par des instances de la classe java.lang.String dont certaines méthodes de manipulation sont décrites ci-dessous, classées par catégorie.
Caractères
[modifier | modifier le wikicode]Les méthodes suivantes comptent en caractères UTF-16 (type char).
int length()- Retourne le nombre de caractères de la chaîne.
char charAt(int index)- Retourne le caractère à l'index spécifié.
char[] toCharArray()- Retourne la séquence de caractères sous forme de tableau.
String substring(int beginIndex, int endIndex)- Retourne une sous-chaîne des caractères entre
beginIndexinclus etendIndexexclu. String substring(int beginIndex)- Retourne une sous-chaîne des caractères entre
beginIndexinclus et la fin de chaîne.
Points de code
[modifier | modifier le wikicode]Les méthodes suivantes comptent en points de code : une séquence de deux caractères faisant partie d'une paire surrogate est traduit en un seul point de code Unicode.
int codePointCount(int beginIndex, int endIndex)- Retourne le nombre de points de code Unicode de la chaîne situés dans l'intervalle d'index spécifiés en nombre de caractères UTF-16.
int codePointAt(int index)- Retourne le point de code à l'index spécifié en nombre de caractères UTF-16.
int codePointBefore(int index)- Retourne le point de code situé juste avant l'index spécifié en nombre de caractères UTF-16. Cela équivaut à
codePointAt(index-1)oucodePointAt(index-2)dans le cas d'une paire surrogate. int offsetByCodePoints(int index, int codePointOffset)- Retourne l'index spécifié en nombre de caractères UTF-16 décalé du nombre de points de code spécifié en second argument.
Construction
[modifier | modifier le wikicode]Concaténation directe
[modifier | modifier le wikicode]Une chaîne de caractères est fréquemment construite en plusieurs parties concaténées.
L'opérateur d'addition + permet la concaténation de chaînes de caractères :
int annee = 2026;
boolean bissextile = (annee%4)==0 && ((annee%100)!=0 || (annee%400)==0);
String message = "L'année " + annee + (bissextile ? " est" : " n'est pas") + " bissextile.";
Il suffit que l'un des opérandes soit une chaîne de caractères pour que la concaténation soit utilisée.
Si l'autre opérande n'est pas une chaîne de caractères, il est converti en chaîne de caractères par l'une des surcharges de la méthode statique String.valueOf.
Concaténation en plusieurs étapes
[modifier | modifier le wikicode]La concaténation des chaînes de caractères s'effectue en allouant un tableau pour stocker les caractères, avec une capacité initiale arbitraire. Ce tableau est redimensionné quand nécessaire, en doublant sa taille. La chaîne finale produite utilise un tableau redimensionné pour réduire sa taille au nombre de caractères réellement utilisé.
Lorsque la construction de la chaîne de caractères se fait sur plusieurs instructions, il vaut mieux utiliser la classe java.lang.StringBuilder afin d'éviter de nombreuses réallocations intermédiaires.
Exemple :
int annee = 2026;
StringBuilder sb = new StringBuilder("L'année ");
sb.append(annee);
if ((annee%4)==0 && ((annee%100)!=0 || (annee%400)==0)) sb.append(" est");
else sb.append(" n'est pas");
sb.append(" bissextile.");
String message = sb.toString();
La concaténation avec l'opérateur + est en fait compilée en utilisant cette classe.
La classe java.lang.StringBuffer permet également la construction de chaînes de caractères, où chaque méthode est synchronisée.
Formatage
[modifier | modifier le wikicode]La méthode format de la classe String permet de créer une chaîne de caractères avec des arguments formatés, comme la famille de fonctions printf du langage C.
int annee = 2026;
boolean bissextile = (annee%4)==0 && ((annee%100)!=0 || (annee%400)==0);
String message = String.format("L'année %d %s bissextile.", annee, (bissextile ? "est" : "n'est pas"));
La classe java.io.PrintStream possède une méthode printf utilisant la méthode String.format pour l'afficher dans le flux de sortie.
int annee = 2026;
boolean bissextile = (annee%4)==0 && ((annee%100)!=0 || (annee%400)==0);
System.out.printf("L'année %d %s bissextile.", annee, (bissextile ? "est" : "n'est pas"));
