Frage

Jedes Mal, wenn ich equals () Methode mit zwei verschiedenen String Objekten, erhalte ich das Ergebnis als falsch, aber wenn ich equals () -Methode mit zwei verschiedenen String-Objekten, erhalte ich das Ergebnis als wahr. Warum?

    String s=new String("434");
    String s1=new String("434");

    System.out.println(s.equals(s1));//true

   StringBuffer s=new StringBuffer("434");
   StringBuffer s1=new StringBuffer("434");

   System.out.println(s.equals(s1));//false
War es hilfreich?

Lösung

Stringüberschreibt nicht equals (). Als solches Object.equals () aufgerufen wird, der die Objektidentität (die Speicheradresse) vergleichen. String enthebt equals und vergleichen Sie den Inhalt.

Andere Tipps

StringBuffer nicht Object#equals() enthebt, so dass Sie erleben Referenz Identität -basierte Kontrollen statt Wert -basierte Kontrollen. Da diese StringBuilder Instanzen deutlich, die jeweils mit unterschiedlichen Speicherplätze sind, wird die Basis Object#equals() Implementierung immer false zurück.

Hier ist die Definition wie von Java 6:

public boolean equals(Object obj) {
  return (this == obj);
}

Sehen Sie das Problem?

Zumindest in meiner Version des JDK (Sun 1.6), ist String nicht eine equals () Methode implementieren. Das bedeutet, es Object der Methode equals () erbt, die die gleiche wie == ist

Wenn Sie wirklich testen wollen zwei Stringbuffers für Gleichheit, könnten Sie rufen x.toString (). Equals (y.toString ())

Wenn das, was Sie suchen, um die String-Darstellungen der beiden String Objekte zu tun vergleichen ist, was ist dann wollen Sie zu tun ist:

StringBuffer sb1 = new StringBuffer("434");
StringBuffer sb2 = new StringBuffer("434");
if (sb1.toString().equals(sb2.toString())) {
  // whatever you want to do if they're equal
} else {
  // whatever you want to do if they're not
}

Ansonsten Sie vergleichen die Gleichheit der beiden String Objekte , deren Inhalte nicht - mit anderen Worten, Objekt # equals () ausgeführt wird, nicht (die nicht existent) String # equals ().

ist gleich nur gibt true zurück auf String Objekte, wenn die beiden Objekte gleich sind. So vergleichen Sie Stringbuffers, wie Sie wollen, verwenden Sie diese:

System.out.println(s.toString().equals(s1.toString());

String s.equals die String-Tabelle verwenden, um die tatsächlichen Zeichenfolge zu vergleichen, wo, wie die String sb.equals wird nur die Standardimplementierung der Methode equals verwenden und nur die Objektzeiger vergleichen.

String hat nicht seine eigene UMSETZUNG der Methode equals es die equals () -Methode von der Objektklasse erbt daher sind die Hashwerte verglichen, anstatt den eigentlichen Inhalt der String zu vergleichen. Daher haben wir es explizit auf ein String-Objekt zu werfen, die für equals die Umsetzung liefert () -Methode.

Die Semantik des String Objekts ist so, dass, wenn zwei Instanzen jemals beobachtet werden, um die gleiche Abfolge von Zeichen enthalten, werden sie immer die gleiche Folge von Zeichen enthalten und man konnte - zumindest vom Standpunkt des String Objekts selbst --replace alle Verweise auf eine der Saiten mit Verweisen auf die andere ohne Programmsemantik zu ändern. Solche Fälle gleichwertig angesehen werden können, weil für alle praktischen Zwecke, die nur in einer Instanz von String verkapselte Informationen die Folge von Zeichen in der Zielinstanz enthalten ist.

Im Gegensatz dazu kapselt eine Variable vom Typ StringBuffer nicht nur eine Folge von Zeichen, sondern auch die Identität eine insbesondere Instanz. Wenn zwei Variablen auf dieselbe Instanz verweisen, auf die Instanz zu ändern, indem eine Variable bezeichnet die Instanz auswirken wird durch das andere bezeichnet (da es die gleiche Instanz). Wenn sie auf verschiedene Instanzen beziehen, Änderungen an der Instanz, auf die man nicht die Instanz beeinflussen durch die andere bezeichnet. Die Entscheidung, nicht zu haben, die Java StringBuffer Überschreibung equals kein Ergebnis von Faulheit, sondern wurde vielmehr basiert auf der Tatsache, dass StringBuffer Objekte haben eine sinnvolle Identität, und disjunkte Instanzen haben immer unterschiedliche Identitäten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top