1. Comparaisons
Les programmeurs doivent constamment comparer différentes variables entre elles. Mais, comme vous l'avez déjà vu, tout n'est pas si simple.
Les nombres entiers sont très faciles à comparer - vous n'avez qu'à les utiliser ==
et le tour est joué. Pour comparer des nombres réels , vous devez comparer leur différence (ou plutôt la valeur absolue de la différence) avec un très petit nombre.
Comparer des cordes est encore plus difficile. C'est avant tout parce que les chaînes sont des objets. De plus, les programmeurs souhaitent souvent que la comparaison de chaînes se déroule un peu différemment selon la situation.
2. Comment les chaînes sont organisées en mémoire
Comme vous l'avez déjà vu, les chaînes sont stockées en mémoire différemment des entiers et des nombres réels :
Deux blocs de mémoire sont utilisés pour stocker les chaînes : un bloc stocke le texte lui-même (sa taille dépend de la taille du texte) tandis que le second bloc (4 octets) stocke l'adresse du premier bloc.
Bien qu'un programmeur expérimenté dise quelque chose comme "la String
str
variable stocke une référence à un String
objet.
3. Attribuer des références à une chaîne
Les avantages de cette approche deviennent évidents lorsque vous devez affecter une variable de chaîne à une autre variable de chaîne. Exemple:
String text = "This is a very important message";
String message = text;
Et voici ce que la mémoire contiendra en conséquence :
Après ce type d'opération d'affectation, l' String
objet reste là où il était et seule son adresse (une référence à l'objet) est copiée dans la message
variable.
4. Travailler avec des références et des objets
Mais si vous décidez de convertir une chaîne en majuscules (lettres majuscules), la machine Java fait tout correctement : vous vous retrouverez avec deux String
objets, et les variables text
et message
stockeront des références, chacune à son propre objet.
Exemple:
String text = "This is a very important message";
String message = text.toUpperCase();
Et voici ce que la mémoire contiendra en conséquence :
Veuillez noter que la toUpperCase()
méthode ne change pas la chaîne sur laquelle elle est appelée. Au lieu de cela, il crée une nouvelle chaîne (nouvel objet) et lui renvoie une référence.
Que diriez-vous d'un exemple encore plus intéressant. Supposons que vous décidiez de transmettre une chaîne à un Scanner
objet (afin qu'il lise les valeurs de la chaîne).
Exemple:
String text = "10 20 40 80";
Scanner console = new Scanner(text);
int a = console.nextInt();
int b = console.nextInt();
Vous pouvez en savoir plus sur le Scanner
fonctionnement de la classe ici .
Voici comment tout sera stocké en mémoire :
Dans ce cas, un seul String
objet reste en mémoire tel qu'il était - seules les références à celui-ci sont transmises et stockées dans des variables.
5. Comparer des références à String
des objets
Et enfin, nous avons atteint la partie amusante : la comparaison de chaînes.
Il existe deux opérateurs que vous pouvez utiliser pour comparer des variables de chaîne : ==
(égal) et !=
(différent de). Vous ne pouvez pas utiliser les opérateurs "supérieur à", "inférieur à" ou "supérieur ou égal à" - le compilateur ne le permettra pas.
Mais il y a une nuance intéressante ici : qu'est-ce qui est réellement stocké dans les variables de chaîne ? C'est exact : adresses (références) aux objets. Et ce sont ces adresses qui seront comparées :
String text = "Hi";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase();
Voici ce qui sera en mémoire :
Les variables message
et text
font référence (stockent l'adresse) au même objet. Mais les variables s1
et s2
stockent des références à des objets très similaires mais distincts.
Et si vous comparez ces 4 variables dans le code, alors vous obtenez le résultat suivant :
Code | Sortie console |
---|---|
|
|
GO TO FULL VERSION