2015-02-20 11 views
10

Prendere in considerazione lo snap al codice qui sotto. usiamo equals() per confrontare oggetti che sono significativamente equivalenti o no? Qui entrambi i valori sono significativamente uguali ma perché longWrapper.equals(0) restituisce false? E quando ho confrontato entrambi i valori con l'operatore ==, restituisce true.Confrontare la classe wrapper con la primitiva usando equals() dà un comportamento strano

Long longWrapper = 0L; 
    long longPrimitive = 0; 

    System.out.println(longWrapper == 0L); // true 
    System.out.println(longWrapper == 0); //true 
    System.out.println(longWrapper == longPrimitive); //true 


    System.out.println(longWrapper.equals(0L)); //true 
    System.out.println(longWrapper.equals(0)); //false 
    System.out.println(longWrapper.equals(longPrimitive)); //true 

risposta

13

longWrapper.equals(0) rendimenti di lungo false, perché 0 è autoboxed a Integer, non Long. Poiché i due tipi sono diversi, .equals() restituisce false.

Nel frattempo, longWrapper == 0 è true, perché il valore longwrapper è unboxed di 0, e 0 == 0 senza considerare i tipi primitivi reali.

4

suo perché 0 non è un lungo - la sua un int, e involucri non convertono intero di per

0

Penso che sia perché lo 0 nel metodo di uguale è un numero intero. Quando si definisce longPrimitive con 0 questo 0 viene castato su un valore lungo. il metodo equals accetta tutti gli oggetti e per questo lo 0 rimane un intero e non viene castato. La mia ipotesi è che nel metodo Equals c'è una chiamata se l'oggetto dato è un'istanza di lunga durata e dato che questo 0 è un Integer risulta falso. Spero che questo ti aiuta

2

Quando si confrontano 0 == 0L, si sta confrontando un int letterale ad un long letterale. Lo int ottiene promoted in un long e quindi i loro valori vengono confrontati. Poiché entrambi sono zero, il risultato è true.

Quando si aggiunge autoboxing al mix, le cose sono leggermente diverse. Una primitiva è sempre autoboxed al suo tipo di wrapper. Qui, 0, che è un valore letterale int, è autoboxato su un'istanza di wrapper java.lang.Integer. Dal java.lang.Long e java.lang.Integer sono diverse classi, equals tra di loro deve restituire false.

1

Questa:

System.out.println(longWrapper == 0); 

è il confronto con ==, in modo che la vostra unboxes Long, e si confrontano due primitive, che sono entrambi a zero.

Questa:

System.out.println(longWrapper.equals(0)); 

è Paragonando equals, quindi merci fino al (int) zero come un Integer. Un oggetto Long non è mai uguale a un oggetto Integer, anche se hanno lo stesso numero.

0

Da Long.java classe:

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

Quindi, quando si confronta un Long ad un int utilizzando eguali, la condizione if fallisce e il metodo restituisce false.

Gli altri metodi restituiscono true causa autoboxing and unboxing

2

System.out.println(0L == 0) è True.

quindi longWrapper == 0 quale unboxed e il risultato è True.

E in Long.equals scritto come -

781  public boolean More ...equals(Object obj) { 
782   if (obj instanceof Long) { 
783    return value == ((Long)obj).longValue(); 
784   } 
785   return false; 
786  } 

così System.out.println(longWrapper.equals(0)); return false come 0 sono imballati in Integer e if (obj instanceof Long) è falso.

Problemi correlati