Comparaison entre string.equals() et == en Java

Rashmi Patidar 15 février 2024
Comparaison entre string.equals() et == en Java

En Java, il existe deux types de comparaison d’objets. Le premier est l’opérateur == qui fonctionne avec les adresses. Il compare en interne les références des objets. En revanche, la méthode equals compare le contenu réel des instances.

Vous trouverez ci-dessous le bloc de code pour illustrer les opérateurs et leur comportement.

public class Main {
  public static void main(String[] args) {
    String str1 = "name";
    String str2 = "name";
    String str3 = new String("name");
    System.out.println(str1.equals(str2));
    System.out.println(str1 == str2);
    System.out.println(str1.equals(str3));
    System.out.println(str3 == str1);
  }
}

Dans le bloc de code ci-dessus, trois instances de chaîne sont définies. Les classes de chaînes sont de nature immuable. L’immuabilité signifie que l’instance qui est créée ne peut jamais être remplacée.

De plus, les variables détiennent la mémoire dans l’emplacement du tas. Ainsi, lors de la création de la chaîne name, elle est enregistrée dans la mémoire du tas. Lorsqu’une autre nouvelle instance, str2 avec la même valeur name, est initialisée, la JVM ne crée pas une autre nouvelle adresse pour elle. Au lieu de cela, il affecte la référence de l’instance str1 à la variable str2.

Le fait détient la preuve lorsque nous essayons de comparer str1==str2 aux deux instances de chaîne. L’instruction résulte true car les deux références pointent vers la même adresse de nom dans la mémoire. Le fait expliqué peut être mieux compris dans le schéma ci-dessous.

Mémoire de tas de chaînes et explication de l’allocation de pool constant

De même, lorsque la méthode equals est appliquée aux deux instances, elle donne la valeur booléenne true. Comme la fonction fonctionne sur la comparaison de contenu, c’est égal.

Ensuite, une autre variable de chaîne str3 est initialisée à l’aide du mot-clé new. La JVM créera en interne un nouvel espace dans la mémoire de tas pour l’adresse name au lieu d’affecter l’instance à la variable str3. Ainsi, lorsque la comparaison de contenu est effectuée, elle renvoie true sur la fonction equals. Il renvoie false lorsque l’adresse est comparée à l’aide de l’opérateur ==.

Voici la sortie du bloc de code ci-dessus.

true
true
true
false
Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

Article connexe - Java String