Ich wollte klären, ob ich das richtig verstanden habe:
==
ist ein Referenzvergleich, d.h. beide Objekte zeigen auf denselben Speicherplatz.equals()
wertet den Vergleich der Werte in den Objekten
Ich wollte klären, ob ich das richtig verstanden habe:
==
ist ein Referenzvergleich, d.h. beide Objekte zeigen auf denselben Speicherplatz.equals()
wertet den Vergleich der Werte in den Objekten String w1 ="Sarat";
String w2 ="Sarat";
String w3 = new String("Sarat");
System.out.println(w1.hashCode()); //3254818
System.out.println(w2.hashCode()); //3254818
System.out.println(w3.hashCode()); //3254818
System.out.println(System.identityHashCode(w1)); //prints 705927765
System.out.println(System.identityHashCode(w2)); //prints 705927765
System.out.println(System.identityHashCode(w3)); //prints 366712642
if(w1==w2) // (705927765==705927765)
{
System.out.println("true");
}
else
{
System.out.println("false");
}
//prints true
if(w2==w3) // (705927765==366712642)
{
System.out.println("true");
}
else
{
System.out.println("false");
}
//prints false
if(w2.equals(w3)) // (Content of 705927765== Content of 366712642)
{
System.out.println("true");
}
else
{
System.out.println("false");
}
//prints true
Sowohl == als auch .equals() beziehen sich auf dasselbe Objekt, wenn Sie .equals() nicht außer Kraft setzen.
Es ist Ihre Entscheidung, was Sie tun möchten, sobald Sie .equals() überschreiben. Sie können den Zustand des aufrufenden Objekts mit dem Zustand des übergebenen Objekts vergleichen oder Sie können einfach super.equals() aufrufen.
Hier ist eine allgemeine Faustregel für den Unterschied zwischen relational operator ==
y the method .equals()
.
object1 == object2
vergleicht, ob sich die von object1 und object2 referenzierten Objekte auf t der gleiche Speicherplatz im Heap .
object1.equals(object2)
vergleicht die Werte von object1 und object2 unabhängig davon, wo sie sich im Speicher befinden .
Dies lässt sich gut anhand von String demonstrieren
Szenario 1
public class Conditionals {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = new String("Hello");
System.out.println("is str1 == str2 ? " + (str1 == str2 ));
System.out.println("is str1.equals(str2) ? " + (str1.equals(str2 )));
}
}
The result is
is str1 == str2 ? false
is str1.equals(str2) ? true
Szenario 2
public class Conditionals {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "Hello";
System.out.println("is str1 == str2 ? " + (str1 == str2 ));
System.out.println("is str1.equals(str2) ? " + (str1.equals(str2 )));
}
}
The result is
is str1 == str2 ? true
is str1.equals(str2) ? true
Dieser String-Vergleich könnte als Grundlage für den Vergleich anderer Objekttypen verwendet werden.
Wenn ich zum Beispiel eine Personenklasse muss ich die Kriterien, auf deren Grundlage ich zwei Personen vergleichen werde . Nehmen wir an, diese Personenklasse hat Instanzvariablen von Größe und Gewicht.
So erstellen Sie Personenobjekte person1 and person2
und für den Vergleich dieser beiden mit dem .equals()
Ich muss die equals-Methode der Klasse person um festzulegen, auf der Grundlage welcher Instanzvariablen (Höhe oder Gewicht) der Vergleich erfolgen soll.
Allerdings ist die == operator will still return results based on the memory location of the two objects(person1 and person2)
.
Um die Verallgemeinerung dieses Personenobjektvergleichs zu erleichtern, habe ich die folgende Testklasse erstellt. Das Experimentieren mit diesen Konzepten wird eine Fülle von Fakten zutage fördern .
package com.tadtab.CS5044;
public class Person {
private double height;
private double weight;
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(height);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
/**
* This method uses the height as a means of comparing person objects.
* NOTE: weight is not part of the comparison criteria
*/
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (Double.doubleToLongBits(height) != Double.doubleToLongBits(other.height))
return false;
return true;
}
public static void main(String[] args) {
Person person1 = new Person();
person1.setHeight(5.50);
person1.setWeight(140.00);
Person person2 = new Person();
person2.setHeight(5.70);
person2.setWeight(160.00);
Person person3 = new Person();
person3 = person2;
Person person4 = new Person();
person4.setHeight(5.70);
Person person5 = new Person();
person5.setWeight(160.00);
System.out.println("is person1 == person2 ? " + (person1 == person2)); // false;
System.out.println("is person2 == person3 ? " + (person2 == person3)); // true
//this is because perosn3 and person to refer to the one person object in memory. They are aliases;
System.out.println("is person2.equals(person3) ? " + (person2.equals(person3))); // true;
System.out.println("is person2.equals(person4) ? " + (person2.equals(person4))); // true;
// even if the person2 and person5 have the same weight, they are not equal.
// it is because their height is different
System.out.println("is person2.equals(person4) ? " + (person2.equals(person5))); // false;
}
}
Das Ergebnis der Ausführung dieser Klasse ist:
is person1 == person2 ? false
is person2 == person3 ? true
is person2.equals(person3) ? true
is person2.equals(person4) ? true
is person2.equals(person4) ? false
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.