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\== Operator wird immer eine Referenz verglichen. Aber im Falle von
equals()-Methode
es hängt von der Implementierung ab, wenn wir die Methode equals überschreiben, dann vergleicht es das Objekt auf der Grundlage der in der überschriebenen Methode angegebenen Implementierung.
class A
{
int id;
String str;
public A(int id,String str)
{
this.id=id;
this.str=str;
}
public static void main(String arg[])
{
A obj=new A(101,"sam");
A obj1=new A(101,"sam");
obj.equals(obj1)//fasle
obj==obj1 // fasle
}
}
Im obigen Code enthalten die Objekte obj und obj1 dieselben Daten, aber der Verweis ist nicht derselbe, so dass equals auch false und == zurückgibt. aber wenn wir die Methode equals überschreiben, dann
class A
{
int id;
String str;
public A(int id,String str)
{
this.id=id;
this.str=str;
}
public boolean equals(Object obj)
{
A a1=(A)obj;
return this.id==a1.id;
}
public static void main(String arg[])
{
A obj=new A(101,"sam");
A obj1=new A(101,"sam");
obj.equals(obj1)//true
obj==obj1 // fasle
}
}
wissen, dass es true und false für den gleichen Fall zurückgeben wird, nur haben wir überschrieben
Gleiche Methode .
er vergleicht das Objekt auf der Grundlage des Inhalts (id) des Objekts
aber ==
noch Referenzen des Objekts vergleichen.
Es sollte hinzugefügt werden, dass bei Wrapper-Objekten für primitive Typen - d. h. Int, Long, Double - == true zurückgibt, wenn die beiden Werte gleich sind.
Long a = 10L;
Long b = 10L;
if (a == b) {
System.out.println("Wrapped primitives behave like values");
}
Wenn man dagegen die beiden oben genannten Longs in zwei getrennte ArrayLists einträgt, sieht equals sie als dasselbe an, aber == tut das nicht.
ArrayList<Long> c = new ArrayList<>();
ArrayList<Long> d = new ArrayList<>();
c.add(a);
d.add(b);
if (c == d) System.out.println("No way!");
if (c.equals(d)) System.out.println("Yes, this is true.");
public class StringPool {
public static void main(String[] args) {
String s1 = "Cat";// will create reference in string pool of heap memory
String s2 = "Cat";
String s3 = new String("Cat");//will create a object in heap memory
// Using == will give us true because same reference in string pool
if (s1 == s2) {
System.out.println("true");
} else {
System.out.println("false");
}
// Using == with reference and Object will give us False
if (s1 == s3) {
System.out.println("true");
} else {
System.out.println("false");
}
// Using .equals method which refers to value
if (s1.equals(s3)) {
System.out.println("true");
} else {
System.out.println("False");
}
}
}
----Ausgang----- wahr falsch wahr
Le site String-Pool (alias Praktikum ) und Ganzzahliger Pool den Unterschied weiter verwischen und Ihnen die Möglichkeit geben, die ==
für Objekte in einigen Fällen anstelle von .equals
Dies kann zu einer höheren Leistung führen (?), allerdings auf Kosten einer höheren Komplexität.
Z.B.:
assert "ab" == "a" + "b";
Integer i = 1;
Integer j = i;
assert i == j;
Komplexitätskompromiss: Das Folgende mag Sie überraschen:
assert new String("a") != new String("a");
Integer i = 128;
Integer j = 128;
assert i != j;
Ich rate Ihnen, sich von solchen Mikro-Optimierungen fernzuhalten, und immer verwenden. .equals
für Objekte, und ==
für Primitive:
assert (new String("a")).equals(new String("a"));
Integer i = 128;
Integer j = 128;
assert i.equals(j);
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.