In Java wird mir gesagt, dass man bei einer Nullprüfung == anstelle von .equals () verwenden soll. Was sind die Gründe dafür?
In Java wird mir gesagt, dass man bei einer Nullprüfung == anstelle von .equals () verwenden soll. Was sind die Gründe dafür?
Antworten:
Das sind zwei völlig verschiedene Dinge. ==
vergleicht die Objektreferenz, falls vorhanden, die in einer Variablen enthalten ist. .equals()
prüft, ob zwei Objekte gemäß ihrem Vertrag gleich sind, was Gleichheit bedeutet. Es ist durchaus möglich, dass zwei unterschiedliche Objektinstanzen gemäß ihrem Vertrag "gleich" sind. Und dann gibt es noch das kleine Detail, dass equals
es sich um eine Methode handelt. Wenn Sie versuchen, sie für eine null
Referenz aufzurufen , erhalten Sie eine NullPointerException
.
Zum Beispiel:
class Foo {
private int data;
Foo(int d) {
this.data = d;
}
@Override
public boolean equals(Object other) {
if (other == null || other.getClass() != this.getClass()) {
return false;
}
return ((Foo)other).data == this.data;
}
/* In a real class, you'd override `hashCode` here as well */
}
Foo f1 = new Foo(5);
Foo f2 = new Foo(5);
System.out.println(f1 == f2);
// outputs false, they're distinct object instances
System.out.println(f1.equals(f2));
// outputs true, they're "equal" according to their definition
Foo f3 = null;
System.out.println(f3 == null);
// outputs true, `f3` doesn't have any object reference assigned to it
System.out.println(f3.equals(null));
// Throws a NullPointerException, you can't dereference `f3`, it doesn't refer to anything
System.out.println(f1.equals(f3));
// Outputs false, since `f1` is a valid instance but `f3` is null,
// so one of the first checks inside the `Foo#equals` method will
// disallow the equality because it sees that `other` == null
public int data
?
Object
, ja. Es wird jedoch von einer großen Anzahl der JDK-Klassen überschrieben. Aber es geht nicht um Implementierung, sondern um Semantik. (Randnotiz: JDK7 ist sehr veraltet.)
wenn Sie rufen .equals()
auf , null
die Sie erhaltenNullPointerException
Es ist daher immer ratsam, die Nichtigkeit zu überprüfen, bevor Sie die Methode aufrufen, wo immer sie gilt
if(str!=null && str.equals("hi")){
//str contains hi
}
Siehe auch
if ("hi".equals(str))
.
someObject.equals(null)
ein aus, NullPointerException
ohne jemals die Methode equals einzugeben.
Objects.equals(a, b)
Es wird keine NullPointerException auslösen, aber es hängt immer noch von der "gleichen" Methode der "a" und "b" ab
Zusätzlich zur akzeptierten Antwort ( https://stackoverflow.com/a/4501084/6276704 ):
Seit Java 1.7 empfehle ich diese Funktion, wenn Sie zwei Objekte vergleichen möchten, die möglicherweise null sind:
Objects.equals(onePossibleNull, twoPossibleNull)
java.util.Objects
Diese Klasse besteht aus statischen Dienstprogrammmethoden für die Bearbeitung von Objekten. Diese Dienstprogramme umfassen null-sichere oder null-tolerante Methoden zum Berechnen des Hash-Codes eines Objekts, zum Zurückgeben einer Zeichenfolge für ein Objekt und zum Vergleichen zweier Objekte.
Seit: 1.7
In Java sind 0 oder null einfache Typen und keine Objekte.
Die Methode equals () ist nicht für einfache Typen erstellt. Einfache Typen können mit == abgeglichen werden.
foo.equals(null)
Was passiert, wenn foo null ist?
Sie erhalten eine NullPointerException.
Laut Quellen spielt es keine Rolle, was für die Implementierung der Standardmethode verwendet werden soll:
public boolean equals(Object object) {
return this == object;
}
equals
In der benutzerdefinierten Klasse können Sie sich jedoch nicht sicher sein .
equals
nur zurückkehren false
oder ein verursachen kann NullPointerException
(oder etwas anderes, wenn die Überschreibungsmethode equals
Unsinn ist).
Object.equals ist null-sicher. Beachten Sie jedoch, dass object.equals true zurückgibt, wenn zwei Objekte null sind. Überprüfen Sie daher, ob die zu vergleichenden Objekte nicht null sind (oder Nullwerte enthalten), bevor Sie object.equals für verwenden Vergleich.
String firstname = null;
String lastname = null;
if(Objects.equals(firstname, lastname)){
System.out.println("equal!");
} else {
System.out.println("not equal!");
}
Das obige Beispiel-Snippet gibt gleich zurück!
Consequently, if both arguments are null, true is returned. ...
:)
Da gleich eine von der Objektklasse abgeleitete Funktion ist, vergleicht diese Funktion Elemente der Klasse. Wenn Sie es mit null verwenden, wird false zurückgegeben, da der Klasseninhalt nicht null ist. Außerdem vergleicht == die Referenz auf ein Objekt.
false
oder NullPointerException
(wenn equals
es nicht zu etwas Schlechtem überschrieben wird).
Hier ist ein Beispiel, wo str != null
aber str.equals(null)
bei der Verwendungorg.json
JSONObject jsonObj = new JSONObject("{field :null}");
Object field = jsonObj.get("field");
System.out.println(field != null); // => true
System.out.println( field.equals(null)); //=> true
System.out.println( field.getClass()); // => org.json.JSONObject$Null
BEARBEITEN:
Hier ist die org.json.JSONObject $ Null- Klasse:
/**
* JSONObject.NULL is equivalent to the value that JavaScript calls null,
* whilst Java's null is equivalent to the value that JavaScript calls
* undefined.
*/
private static final class Null {
/**
* A Null object is equal to the null value and to itself.
*
* @param object
* An object to test for nullness.
* @return true if the object parameter is the JSONObject.NULL object or
* null.
*/
@Override
public boolean equals(Object object) {
return object == null || object == this;
}
}
field.equals(null)
true zurückgegeben wird. Dies bricht das übliche Java-Verhalten und ist daher verwirrend. field.equals("null")
Zumindest aus meiner Sicht sollte es nur funktionieren . Ich weiß nicht, warum die Bibliotheksentwickler dachten, dass dies gut zu unterstützen wäre.
str != null
und str.equals(null)
kehren Sie zurück, true
wenn Sie org.json verwenden ."?
jsonObject
Schlüssel "Feld" enthält, weshalb er field
nicht null ist. Er hat eine Referenz, die das json.org.JSONObject$Null
Objekt enthält
Null
gerne behandeln null
und "null"
stattdessen verwenden. Aber ich denke, sie haben das getan, um zu vermeiden, dass Strings benötigt werden. Aber auch mit dieser Bibliothek field.equals(null)
ist fast immer noch ein Thema: P.
Ihr Code verstößt gegen Demeters Gesetz. Deshalb ist es besser, das Design selbst zu überarbeiten. Als Problemumgehung können Sie Optional verwenden
obj = Optional.ofNullable(object1)
.map(o -> o.getIdObject11())
.map(o -> o.getIdObject111())
.map(o -> o.getDescription())
.orElse("")
oben ist die Hierarchie eines Objekts zu überprüfen, also einfach verwenden
Optional.ofNullable(object1)
wenn Sie nur ein Objekt überprüfen müssen
Hoffe das hilft !!!!
Das kannst du immer tun
if (str == null || str.equals(null))
Dadurch wird zuerst die Objektreferenz und dann das Objekt selbst überprüft, sofern die Referenz nicht null ist.
x.equals(null)
.
equals()
und zu sehen. Wenn Sie es versuchen, wird es sofort offensichtlich sein