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
Hola Brian! Gracias por la respuesta, pero ¿pueden decirme dónde puedo encontrar esta explicación sobre este rango (-128 -> 127)? –
@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) –
@RenatoLochetti Pregunta editada para ampliar el tema. –