Ho voluto mettere alla prova l'operatore '==' su Long
s e questo è quello che ho trovato: il seguente codice:Qual è la causa di questo strano comportamento di Java?
public static void main(final String[] args) {
final Long n = 0L;
final Long m = 0L;
System.out.println(n + " == " + m + " : " + (n == m));
final Long a = 127L;
final Long b = 127L;
System.out.println(a + " == " + b + " : " + (a == b));
final Long A = 128L;
final Long B = 128L;
System.out.println(A + " == " + B + " : " + (A == B));
final Long x = -128L;
final Long y = -128L;
System.out.println(x + " == " + y + " : " + (x == y));
final Long X = -129L;
final Long Y = -129L;
System.out.println(X + " == " + Y + " : " + (X == Y));
}
uscite:
0 == 0 : true
127 == 127 : true
128 == 128 : false
-128 == -128 : true
-129 == -129 : false
L'unica spiegazione che poteva venire con JVM è stato memorizzato tutti i valori long
all'interno di [-128, 127]
nello spazio Perm, e dà il loro indirizzo a Long
s e per tutto al di fuori dell'intervallo sopra crea una nuova allocazione per ogni valore statico incontrato nel codice.
Sono vicino ad avere ragione? In quali situazioni dobbiamo essere consapevoli di comportamenti simili?
PS. So che dovrei usare un assegno null
e poi .equals()
per confrontare gli oggetti, ma ero curioso se qualcuno conoscesse la risposta.
EDIT
Dopo jtahlborn 's risposta che mi ha dato la parola auto-boxing ho trovato questo grande articolo con la well-documented answer
Sì, hai ragione. (E sì, usare '==' qui invece di '.equals' è un sin.) –
http://stackoverflow.com/questions/11955958/with-abstract-datatypes-different-results-for-the-same- tipo di condizioni/11955984 # 11955984 – kosa
NON si deve utilizzare un controllo nulla. Gli assegni nulli sono malvagi. Basta non usare NULL. –