Vergleich zwischen string.equals() vs == in Java

Rashmi Patidar 15 Februar 2024
Vergleich zwischen string.equals() vs == in Java

In Java gibt es zwei Arten von Objektvergleichen. Der erste ist der Operator ==, der mit den Adressen arbeitet. Es vergleicht intern die Referenzen der Objekte. Andererseits vergleicht die Methode equals den tatsächlichen Inhalt der Instanzen.

Unten ist der Codeblock, um die Operatoren und ihr Verhalten zu demonstrieren.

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);
  }
}

Im obigen Codeblock werden drei Instanzen von string definiert. Die String-Klassen sind unveränderlich. Die Unveränderlichkeit bedeutet, dass die erstellte Instanz niemals überschrieben werden kann.

Darüber hinaus halten die Variablen den Speicher an der Heap-Position. Während die Zeichenkette name erstellt wird, wird sie im Heap-Speicher gespeichert. Wenn eine andere neue Instanz, str2 mit demselben name-Wert, initialisiert wird, erstellt die JVM keine weitere neue Adresse dafür. Stattdessen weist es die Referenz der Instanz str1 der Variablen str2 zu.

Die Tatsache hält den Beweis, wenn wir versuchen, str1==str2 mit den beiden String-Instanzen zu vergleichen. Die Aussage ergibt true, da beide Referenzen auf dieselbe Namensadresse im Speicher verweisen. Die erläuterte Tatsache kann in der folgenden Abbildung besser verstanden werden.

Erklärung zum String-Heap-Speicher und zur Konstanten-Pool-Zuweisung

Wenn die Methode equals auf beide Instanzen angewendet wird, ergibt dies den booleschen Wert true. Da die Funktion mit dem Inhaltsvergleich arbeitet, ist sie gleich.

Als nächstes wird eine weitere String-Variable str3 mit dem Schlüsselwort new initialisiert. Die JVM erstellt intern einen neuen Platz im Heap-Speicher für die Adresse name, anstatt die Instanz der Variablen str3 zuzuweisen. Wenn also der Inhaltsvergleich durchgeführt wird, gibt er true für die Funktion equals zurück. Es gibt false zurück, wenn die Adresse mit dem Operator == verglichen wird.

Hier ist die Ausgabe des obigen Codeblocks.

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

Verwandter Artikel - Java String