781 Stimmen

Was ist der Unterschied zwischen == und equals() in Java?

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

3voto

Sachin Jadhav Punkte 111

\== 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.

2voto

Elroch Punkte 132

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.");

2voto

Aamir M Meman Punkte 1302
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

2voto

Dearwolves Punkte 435

== kann in vielen Objekttypen verwendet werden, aber Sie können Object.equals für jeden Typ, insbesondere für Strings und Google Map Markers.

1voto

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.com

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.

Powered by:

X