Die kurze Antwort
Der entscheidende Punkt ist folgender:
==
zwischen zwei Referenztypen ist immer Referenzvergleich
- Meistens, z. B. mit
Integer
und String
, möchten Sie equals
stattdessen verwenden
==
zwischen einem Referenztyp und einem numerischen Grundtyp ist immer ein numerischer Vergleich
- Der Referenztyp wird einer Unboxing-Konvertierung unterzogen
- Unboxing
null
wirft immerNullPointerException
- Während Java viele spezielle Behandlungen für hat
String
, ist es in der Tat KEIN primitiver Typ
Die obigen Anweisungen gelten für jeden gültigen Java-Code. Mit diesem Verständnis gibt es keinerlei Inkonsistenz in dem von Ihnen präsentierten Snippet.
Die lange Antwort
Hier sind die relevanten JLS-Abschnitte:
Wenn die Operanden eines Gleichheitsoperators entweder vom Referenztyp oder vom Nulltyp sind , ist die Operation Objektgleichheit.
Dies erklärt Folgendes:
Integer i = null;
String str = null;
if (i == null) {
}
if (str == null) {
}
if (str == "0") {
}
Beide Operanden sind Referenztypen, und deshalb ==
ist dies der Vergleich der Referenzgleichheit.
Dies erklärt auch Folgendes:
System.out.println(new Integer(0) == new Integer(0));
System.out.println("X" == "x".toUpperCase());
Um ==
numerische Gleichheit zu erreichen, muss mindestens einer der Operanden ein numerischer Typ sein :
Wenn die Operanden eines Gleichheitsoperators beide vom numerischen Typ sind oder einer vom numerischen Typ und der andere vom numerischen Typ konvertierbar ist, wird für die Operanden eine binäre numerische Heraufstufung durchgeführt. Wenn der heraufgestufte Typ der Operanden int
oder ist long
, wird ein ganzzahliger Gleichheitstest durchgeführt; Wenn der float or
heraufgestufte Typ double` ist, wird ein Gleitkomma-Gleichheitstest durchgeführt.
Beachten Sie, dass die binäre numerische Heraufstufung eine Konvertierung von Wertesätzen und eine Unboxing-Konvertierung durchführt.
Dies erklärt:
Integer i = null;
if (i == 0) {
}
Hier ist ein Auszug aus Effective Java 2nd Edition, Punkt 49: Ziehen Sie Grundelemente Boxed-Grundelementen vor :
Zusammenfassend lässt sich sagen, dass Sie Primitive gegenüber Boxed-Primitiven bevorzugen, wenn Sie die Wahl haben. Primitive Typen sind einfacher und schneller. Wenn Sie Grundelemente in Schachteln verwenden müssen, seien Sie vorsichtig! Autoboxing reduziert die Ausführlichkeit, aber nicht die Gefahr der Verwendung von Grundelementen in Schachteln. Wenn Ihr Programm zwei Grundelemente mit dem ==
Operator vergleicht, führt es einen Identitätsvergleich durch, der mit ziemlicher Sicherheit nicht Ihren Wünschen entspricht. Wenn Ihr Programm Berechnungen vom gemischten Typ mit primitiven Box- und Unboxed-Grundelementen ausführt, wird das Unboxing ausgeführt, und wenn Ihr Programm das Unboxing ausführt, kann es ausgelöst werden NullPointerException
. Wenn Ihr Programm primitive Werte enthält, kann dies zu kostspieligen und unnötigen Objekterstellungen führen.
Es gibt Orte, an denen Sie keine andere Wahl haben, als Box-Primitive zu verwenden, z. B. Generika. Andernfalls sollten Sie ernsthaft überlegen, ob eine Entscheidung zur Verwendung von Box-Primitiven gerechtfertigt ist.
Verweise
Verwandte Fragen
Verwandte Fragen