2012-01-23 11 views
29

Por qué el código siguiente devuelve falso para long3 == long2 comparación aunque es literal.java Comparación de tipos de datos largos

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)); 
    } 
} 

Respuesta

58

Long es un objeto, no una primitiva. Al usar == está comparando los valores de referencia .

que tiene que hacer:

if(str.equals(str2)) 

como lo hace en su segunda comparación.

Edit: Lo entiendo ... usted está pensando que otros objetos actúan como literales String. Ellos no *. Y aun así, nunca querrá usar == con literales String tampoco.

(* tipos AUTOBOX hacen implementar el patrón de peso mosca, pero sólo para los valores de -128 -> 127. Si usted hizo su Long igual a 50 que tendría de hecho dos referencias al mismo objeto peso mosca y otra vez, Nunca usar. == compararlos)

Editar para añadir:. Esto se afirma específicamente en la especificación del lenguaje Java, Section 5.1.7:

Si el valor p de ser en caja es verdadero, falso, un byte, o un char en el rango \ u0000 a \ u007f, o un número entero o corto entre -128 y 127 (inclusive), luego, deje que r1 y r2 sean los resultados de dos conversiones de boxeo cualquiera de p. Siempre es el caso que r1 == r2.

Tenga en cuenta que long es no mencionadas específicamente, pero las actuales implementaciones de Oracle y OpenJDK lo hacen (1.6 y 1.7), que es una razón más para Nunca uso ==

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

Salidas:

true
false

+0

Hola Brian! Gracias por la respuesta, pero ¿pueden decirme dónde puedo encontrar esta explicación sobre este rango (-128 -> 127)? –

+1

@RenatoLochetti Está cubierto en [Java Language Spec (JLS) sección 5.1.7 - último párrafo] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls -5.1.7). Es una implementación del [patrón Flyweight] (http://en.wikipedia.org/wiki/Flyweight_pattern) –

+1

@RenatoLochetti Pregunta editada para ampliar el tema. –

3

También puede obtener el valor simple del objeto largo usando:

str.longValue() 
3

Si usted quiere hacer

 str3==str2 

hacer como esto ..

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

Esto cumple su propósito y mucho más rápido porque está comparando dos tipos primitivos pe valores no objetos

0

Aquí Long es una clase Wrapper por lo que la línea a continuación comparará la referencia, no el contenido.

long3 == long2

siempre es mejor para comparar con .longValue **() **, como a continuación

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

Si utilizamos en la construcción método igual() que también hará lo mismo cosa con cheque nulo.

long3.equals(long2)

A continuación se muestra la implementación interna de iguales() en Java

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