it-swarm.com.de

java Langer Datentypvergleich

Warum gibt der folgende Code false für den Vergleich von long3 == long2 zurück, auch wenn er wörtlich ist.

public class Strings {

    public static void main(String[] args) {
        Long long1 = 256L + 256L;
        Long long2 = 512L;
        Long long3 = 512L;
        System.out.println(long3 == long2);
        System.out.println(long1.equals(long2));
    }
}
33
Manu

Long ist ein Objekt, kein Primitiv. Mit == vergleichen Sie die Referenzwerte.

Sie müssen tun:

if(str.equals(str2))

Wie Sie es in Ihrem zweiten Vergleich tun.

Edit: Ich verstehe ... Sie denken, dass andere Objekte wie String Literale wirken. Sie tun es nicht *. Und selbst dann möchten Sie == niemals mit String-Literalen verwenden. 

(* Autobox-Typen implementieren das Flyweight-Muster, jedoch nur für die Werte -128 -> 127. Wenn Sie Ihre Long gleich 50 setzen, haben Sie in der Tat zwei Verweise auf dasselbe Flyweight-Objekt. Und wieder niemals ==, um sie zu vergleichen.)

Bearbeiten, um hinzuzufügen: Dies ist in der Java-Sprachspezifikation ausdrücklich angegeben. Abschnitt 5.1.7 :

Wenn der umschlossene Wert p wahr, falsch, ein Byte oder ein Zeichen im Bereich von\u0000 bis\u007f oder eine int oder kurze Zahl zwischen -128 und 127 (einschließlich) ist, dann seien r1 und r2 die Ergebnisse von zwei beliebige Box-Konvertierungen von p. Es ist immer so, dass r1 == r2 ist.

Beachten Sie, dass longnicht ausdrücklich erwähnt wird, die aktuellen Oracle- und OpenJDK-Implementierungen (1.6 und 1.7) jedoch, was ein weiterer Grund für never ist, verwenden Sie ==.

Long l = 5L;
Long l2 = 5L;
System.out.println(l == l2);
l = 5000L;
l2 = 5000L;
System.out.println(l == l2);

Ausgänge:

wahr
falsch

62
Brian Roach

Wenn du willst 

      str3==str2

mag das .. 

     str3.longValue()==str2.longValue()

Dies dient Ihrem Zweck und ist viel schneller, da Sie zwei primitive Typwerte und keine Objekte vergleichen.

3

Sie können den primitiven Wert auch aus dem Long-Objekt abrufen:

str.longValue()
3
Mr_CRivera

Hier ist Long eine Wrapper-Klasse, daher wird in der folgenden Zeile die Referenz und nicht der Inhalt verglichen.

long3 == long2

es ist immer besser, mit ** .longValue () ** zu vergleichen, wie unten

long3.longValue() == long2.longValue()

Wenn wir die eingebaute Methode equal () verwenden, wird dies auch mit der Nullprüfung durchgeführt.

long3.equals(long2)

Unten sehen Sie die interne Implementierung von equals () in Java

public boolean equals(Object obj) {
    if (obj instanceof Long) {
        return value == ((Long)obj).longValue();
    }
    return false;
}
0
TheSprinter