Curiosidad en java

auto-boxing en javaDe este post del foro, sale un ejemplo curioso de java. Fíjate en el siguiente código

public static void main (String [] args) {
   Integer a = 100;
   Integer b = 100;

   System.out.println(a == b);
}

Pues bien, este ejemplo da como resultado "true". Si cambias los valores de a y b (pero manteniéndolos iguales), verás una cosa curiosa. Para valores entre -128 y 127, el resultado es "true". Para valores fuera de ese rango, el resultado es "false".

El motivo podemos encontrarlo en este post sobre Auto-Boxing del Weblog de Victor Ramirez. Teóricamente las instancias de Integer que se crean de forma más o menos automáticamente en esas asignaciones deberían ser distintas y el == debería dar siempre "false". Pero por eficiencia, el compilador reaprovecha instancias de estas clases, de forma que cuando se hace este tipo de conversión (de un tipo primitivo a un objeto Integer, Boolean, o lo que sea), se tiene que == da "true" en los siguientes casos:

  • Siempre en los Boolean y en los Byte
  • Entre -128 y 127 en los Short e Integer
  • Entre u0000 y u007F en los Character.

Una curiosidad que puede dar muchos quebraderos de cabeza a un programador novato que no tiene muy controlada la diferencia entre el método equals() y el ==.

Esta entrada ha sido publicada en java y etiquetada como , , , . Guarda el enlace permanente.

4 respuestas a Curiosidad en java

  1. Bladimir Rondon dijo:

    Por eso siempre es una buena practica usar el método equals para comparar el estado entre objetos.
    Ese ejemplo y el clasico con los String son preguntas de certificación.
    Ejemplo de los String:

    String a= new String(«HOLA MUNDO»);
    String b= new String(«HOLA MUNDO»);
    if (a == b) System.out.println(«IGUALES»)
    else System.out.println(«DIFERENTES»);

    Cual es la salida?…

    Muy buen post.

  2. Pingback: Tweets that mention Diario de Programación » Blog Archive » Curiosidad en java -- Topsy.com

  3. jgutix dijo:

    Es algo parecido a lo que sucede con los objetos String, al compararlos con == no necesariamente el resultado sea true aunque sean la misma cadena.
    Esto es por que lo que se compara en este caso son las instancias del objeto no su valor.
    Por eso siempre que quiero comparar la igualdad entre objetos uso el método equals.

  4. Mike dijo:

    @Bladimir

    Error de compilacion, te falto un «;»

    ;D

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.