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 :

Comment les chaînes sont organisées en mémoire

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 strvariable stocke une référence à un Stringobjet.


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 :

Affectation de références à une chaîne

Après ce type d'opération d'affectation, l' Stringobjet reste là où il était et seule son adresse (une référence à l'objet) est copiée dans la messagevariable.


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 Stringobjets, et les variables textet messagestockeront 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 :

Travailler avec des références et des objets

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 Scannerobjet (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 Scannerfonctionnement de la classe ici .

Voici comment tout sera stocké en mémoire :

Travailler avec des références et des objets.  Classe de numérisation

Dans ce cas, un seul Stringobjet 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 à Stringdes 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 :

Comparaison des références aux objets String

Les variables messageet textfont référence (stockent l'adresse) au même objet. Mais les variables s1et s2stockent 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
String text = "Hi";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase();
System.out.println(text == message);
System.out.println(text == s1);
System.out.println(s1 == s2); 


true  // The addresses are equal
false // The addresses are different
false // The addresses are different