Vergleiche zwei primitive lange Variablen in Java

8

Der Titel ist ziemlich selbsterklärend. Ich ziehe von C # nach Java um. Ich habe ein Objekt und eine Getter-Methode, die ihre ID zurückgibt. Ich möchte die IDs zweier Objekte desselben Typs vergleichen und prüfen, ob die Werte ihrer IDs gleich sind.

versucht:

%Vor% %Vor% %Vor%     
Dragan 13.03.2012, 19:47
quelle

6 Antworten

21

In Java:

  • Der Operator == sagt Ihnen, ob die beiden Operanden das gleiche Objekt (Instanz) sind.
  • Die Methode .equals() für Long sagt Ihnen, ob sie gleich im Wert sind.

Aber Sie sollten auch nicht tun. Der richtige Weg, dies zu tun, ist dies:

%Vor%

Mit assertEquals() , wenn die Assertion fehlschlägt, wird die Fehlermeldung Ihnen sagen, was die beiden Werte waren, zB expected 2, but was 5 etc

    
Bohemian 13.03.2012, 19:51
quelle
2

Versuchen Sie Folgendes:

%Vor%     
bsimic 13.03.2012 19:51
quelle
2

Sie dürfen nicht gleich sein mit ==. Verwenden Sie entweder:

%Vor%

oder

%Vor%

In beiden Fällen habe ich Null-Checks weggelassen, weil ich bezweifle, dass Sie sie vergessen würden, wenn sie hier gebraucht würden;)

Also, warum ist Long nicht immer == ein anderer Long mit dem gleichen Wert? Die Antwort ist einfach. Sie sind verschiedene Objekte! Je nachdem, wie wie das Long abgerufen wurde, können sie aufgrund interner Zwischenspeicherung identisch sein. Siehe Long.valueOf .

    
spidey 13.03.2012 19:52
quelle
2

Zusätzlich zu allen Kommentaren zum richtigen Vergleich kann eine starke Typisierung Ihnen bei der Lösung Ihres Problems helfen.

Liefert getID () etwas vom Typ Long (das ist ein Klassentyp) oder vom Typ long (das ist ein primitiver Typ)? Das Problem ist, dass, wenn die Methode einen primitiven Wert zurückgibt, der Vergleich mit '==' und 'equals ()' funktionieren wird, da Java Grundelemente automatisch in Wrapperobjekte umwandelt, wenn Sie sie benötigen.

Aber andersherum, wenn getID () einen Long-Wert zurückgibt, wird der Vergleich mit '==' wahrscheinlich fehlschlagen, weil das prüft, ob Sie dasselbe Objekt haben, nicht wenn die Objekte den gleichen Wert haben.

    
Jochen 13.03.2012 20:00
quelle
1

in Java,

Verwenden Sie == , um Grundelemente und x.equals(y) zu vergleichen, um Objekte zu vergleichen.

Ich bin mir nicht sicher, was deine Frage ist - es sieht so aus, als ob du beides versucht hast, und hat auch nicht funktioniert?

Beachten Sie, dass Sie Long anstelle von long verwenden, daher möchten Sie .equals()

verwenden

( long ist ein Grundelement, Long ist ein Objekt)

    
edthethird 13.03.2012 19:51
quelle
1

Sie müssen den Unterschied zwischen Long und long kennen - long ist der primitive Typ, Long ist der Wrappertyp. (Ein bisschen wie ein Boxed-Wert in C #, aber stark typisiert.) Was ist der Rückgabetyp von getId() ?

Einfach:

%Vor%

sollte in Ordnung sein, wenn Sie dies in einem Test machen. Andernfalls könnten Sie Folgendes verwenden:

%Vor%

wenn sie definitiv nicht null sind oder verwenden Sie Guava :

%Vor%

um Nichtigkeit zu behandeln. (Sie können Objects.equal natürlich, aber du solltest auf jeden Fall Guava auf jeden Fall ergattern, also kannst du das auch nutzen. ..)

Es ist erwähnenswert, dass bestimmte Wrapper-Objekte wiederverwendet werden - zum Beispiel:

%Vor%

y = 10000L; assertTrue (x == y); // Referenzvergleich

    
Jon Skeet 13.03.2012 19:50
quelle

Tags und Links