2012-10-21 9 views
7
Object o1 = new Object(); 
Object o2 = new Object(); 
//o1=o2; 
System.out.println(o1.equals(o2)); 

Es gibt false zurück. Es kann true zurückgeben, wenn der Kommentar entfernt wird.Verwenden der equals() -Methode mit String und Objekt in Java


Warum ist nicht das Gleiche für die String Klasse?

String s1=new String(); 
String s2=new String(); 
System.out.println(s1.equals(s2)); 

Es gibt true zurück. Warum? (Weil String Praktikanten oder etwas verwendet sonst beteiligt?)

Antwort

17

Da equals() for String vergleicht den Inhalt, nicht das Objekt selbst.

public boolean equals (Object anObject)

Vergleicht diese Zeichenfolge mit dem angegebenen Objekt. Das Ergebnis ist nur dann wahr, wenn das Argument nicht null ist und ein Objekt String ist, das die gleiche Zeichenfolge wie dieses Objekt darstellt.

/* String.equals() */ 
public boolean equals(Object anObject) { 
    if (this == anObject) { 
     return true; 
    } 
    if (anObject instanceof String) { 
     String anotherString = (String)anObject; 
     int n = count; 
     if (n == anotherString.count) { 
      char v1[] = value; 
      char v2[] = anotherString.value; 
      int i = offset; 
      int j = anotherString.offset; 
      while (n-- != 0) { 
       if (v1[i++] != v2[j++]) 
        return false; 
      } 
      return true; 
     } 
    } 
    return false; 
} 

(Link zur Quelle von String.equals())

Versus the equals for Object:

Die Methode equals für Klasse Object der kritischste möglich ¨Aquivalenzrelation auf Objekte implementiert; Das heißt, für alle Nicht-Null-Referenzwerte x und y gibt diese Methode nur dann true zurück, wenn sich x und y auf dasselbe Objekt beziehen (x == y hat den Wert true).

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

(Link zur Quelle von Object.equals())

Auch vergessen Sie nicht, den Vertrag der equals() Funktion:

Das Gleichheits Verfahren implementiert eine Äquivalenzrelation auf nicht- Null-Objekt-Referenzen:

  • Es ist reflexiv: Für jeden Nicht-Null-Referenzwert x sollte x.equals(x) True zurückgegeben werden.
  • Es ist symmetrisch: für alle Nicht-Null-Referenzwerte x und y, x.equals(y) return true sollte, wenn und nur wenn y.equals(x) gibt true zurück.
  • Es ist transitiv: für alle Nicht-Null-Referenzwerte x, y und z, wenn x.equals(y) kehrt true und y.equals(z) kehrt true, dann x.equals(z)true zurückkehren.
  • Es ist konsistent: für alle Nicht-Null-Referenzwert x und y, mehrere Aufrufe von x.equals(y) konsequent true zurückzukehren oder konsequent false zurückkehren, sofern keine Information, die in gleich Vergleiche zu den Objekten verändert werden.
  • Für jeden Nicht-Null-Referenzwert x sollte falsex.equals(null) zurückgegeben werden.

auch zum Lesen empfohlen:

+0

Neben der 'Object' Klasse, geschieht das Gleiche mit einer Klasse, die wir erstellen. Warum? Wird die Klassenmethode 'Object' verwendet? – Tiny

+0

@Tiny Wenn Sie 'equals' in Ihrer Klasse nicht überschreiben, erbt es die 'equals'-Methode von Object. – assylias

+0

@Tiny Da jede Klasse von Object abstammt. Sie sollten die Methoden 'equals()' und 'hashCode()' für Ihre eigenen Klassen außer Kraft setzen, andernfalls werden sie die der 'Object'-Klasse verwenden. – ppeterka

8

equals für Object vergleicht Speicherreferenzen.
Deshalb ist es falsch, da sie unterschiedlich sind Object s
equals für String wird überschrieben, um basierend auf Zeichen zu vergleichen.
Sie haben 2 leere String Objekte, weshalb equalstrue zurückgibt.

+0

Sind 'o1 == o2' und' o1.equals (o2) 'selbe (beide sind Objekte wie in der Frage angegeben)? Sie scheinen in der Spezifikation identisch zu sein. – Tiny

+0

Ja. 'Equals' von' Object' hat: 'zurückzus == o2' – Cratylus

2

Die equals implementiert in der Object Klasse vergleichen nur Referenzen. Hier ist der Quellcode:

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

Ist' o1 == o2' und 'o1.equals (o2)' gleich (beide sind Objekte wie in der Frage angegeben)? Sie scheinen in der Spezifikation identisch zu sein. – Tiny

+0

@Tiny Nur im ersten Fall, wenn Sie zwei Instanzen der Object-Klasse erstellen. In Ihrem zweiten Fall erstellen Sie Instanzen der String-Klasse, die die equals-Methode überschreibt und dann beide Objekte vergleicht, um festzustellen, ob sie denselben Text enthalten. –

+0

Danke. Entfernte meine Zweifel. – Tiny

2

entspricht braucht Methode innerhalb der Klasse außer Kraft gesetzt werden, wenn Sie wollen, um es auf eine andere Weise verhalten. Standardmäßig prüft es, ob sich zwei Referenzen auf dasselbe Objekt beziehen.

+0

Sind 'o1 == o2' und' o1.equals (o2) 'selbe (beide sind Objekte wie in der Frage angegeben)? Sie scheinen in der Spezifikation identisch zu sein. – Tiny

4

== vergleicht Adressen der Objekte/Strings/alles

.equals() entworfen zum Vergleich internen Zustand der Objekte zu verwenden.

So:

new Object() == new Object() => false - zwei separates Objekt an verschiedenen Orten im Speicher.

new String("a") == new String("a") => false - die gleiche Situation - zwei separate Adressen für die String-Objekte.

new String("a").equals(new String("a")) => true - Adressen unterscheiden sich, aber Java nimmt einen Objektstatus ('a') und vergleicht es mit anderen Objektzuständen ('a'), werden sie gleich gefunden und melden wahr.

Mit der Methode equals() können Sie den Vergleich so programmieren, wie es für Ihr Programm geeignet ist.

intern() ist ein bisschen anders aus. Es ist beabsichtigt, dasselbe Objekt (Adresse) für dieselbe Char-Sequenz zurückzugeben. Es ist nützlich, die Menge an Speicher zu reduzieren, die benötigt wird, wenn die gleichen Strings mehrmals erstellt werden.

new String("aaa").intern() wird im Maschinenspeicher suchen, wenn jemals jemand "aaa" Zeichenkette vorher erstellt hat und die erste Instanz der Zeichenkette zurückgibt ... Wenn nicht gefunden wurde - die aktuelle wird als erste und alle weiteren eingetragen "aaa" .intern() und neu String("aaa").intern() und ("a"+"aa").intern() werden diese "erste" Instanz zurückgeben.

Vorsicht: "aaa".intern() ist nicht sehr schnelle Operation und wenn Sie alle Zeichenfolgen internieren - Sie sparen etwas Speicher, aber wird eine Menge CPU-Arbeit verlieren.

+0

Sind 'o1 == o2' und' o1.equals (o2) 'same (beide sind Objekte wie in der Frage angegeben)? Wissen Sie? – Tiny

1

Die equals() Methode der Object Klasse kann nicht Strings zu vergleichen, es kann nur Objekte zu vergleichen. Zum Vergleichen von Strings überschreibt eine String-Klasse die equals()-Methode und vergleicht Strings darin.

Object.equals() vergleicht nur Referenzen, wobei String.equals() Werte vergleichen wird.

Verwandte Themen