Ici aussi les opérateurs amènent au même résultat, voyons un cas où ça se complique :
String prenom1 = new String("Maxime");
String prenom2 = new String("Maxime");
System.out.println(prenom1 == prenom2); //false
System.out.println(prenom1.equals(prenom2)); //true
Dans ce dernier cas, les valeurs retournées par les deux comparaisons diffèrent.
La valeur des deux Strings est identique, pourtant la comparaison avec l’opérateur « == » renvoie faux. Cela signifie que contrairement à ce que l’on pourrait penser, cet opérateur ne compare pas les valeurs données aux Strings.
Dans ce cas, les deux variables pointent vers la même adresse :
Comme il y a déjà une String avec la valeur désirée, prenom2 va pointer vers l’adresse de celle-ci. C’est pourquoi prenom1 et prenom2 ont le même Hash Code.
Ici, les valeurs des Strings sont différentes, prenom1 et prenom2 pointent donc logiquement vers des adresses différentes.
String prenom1 = new String("Maxime");
String prenom2 = new String("Maxime");
System.out.println(prenom1 == prenom2); //false
System.out.println(prenom1.equals(prenom2)); //true
System.out.println(System.identityHashCode(prenom1)); //168423058
System.out.println(System.identityHashCode(prenom2)); //821270929
Ce dernier cas est plus complexe. En effet, même si une String avec la valeur « Maxime » existe déjà, l’instruction « new » va créer une nouvelle String sans contrôler le fait qu’une String avec la même valeur existe déjà. La variable « prenom2 » va pointer vers cette nouvelle String alors que « prenom1 » va pointer vers la première String. C’est pour cette raison que ces deux variables ont un Hash Code différent.
Conclusion
La méthode. equals() est à utiliser pour comparer la valeur de deux Strings tandis que l’opérateur « == » les compare par référence. Pour aller plus loin et comprendre un peu mieux comment ça se traduit dans la JVM, vous pouvez vous rendre sur cet article (https://www.geeksforgeeks.org/string-constant-pool-in-java/).
Introduction
Sur un des projets sur lesquels j’interviens, diverses personnes ont contribué au cours des années parfois sans passation entre les équipes.
En regardant les commits, on voit qu’une équipe a mis un ORM, une autre l’a enlevé, une autre a mis un autre ORM etc..
Le coût en temps pour l’entreprise est considérable car ce n’est pas une opération a...
Introduction
Vous avez diagnostiqué une fuite mémoire et vous voulez corriger le problème.
Si vous utilisez IntelliJ, vous avez à disposition dans votre IDE un outil puissant qui vous permettra de diagnostiquer la source du problème et vérifier vot...
Introduction
JaCoCo est un outil très connu dans le monde Java qui permet de générer des rapports de code coverage au format xml et html.
L’intérêt sera souvent de donner le rapport au format xml à d’autres outils (Codecov ou Sonar par exemp...
Introduction
Dans nos applications, il y a souvent des objets qui dépendent les uns des autres (un Service avec des Repository par exemple). Si on devait satisfaire ces dépendances “à la main”, on devrait les instancier, vérifier que ça n’ait pas ...