2011-11-22 13 views
5

que había un fragmento de código:Entero objeto de clase

public class Test{ 
    public static void main(String args[]){ 
     Integer a = 100; 
     Integer b = 100; 
     Integer c = 5000; 
     Integer d = 5000; 

     System.out.println(a); 
     System.out.println(b); 
     System.out.println(c); 
     System.out.println(d); 
     if(a == b) 
      System.out.println("a & b Both are Equal"); 
     else 
      System.out.println("a & b are Not Equal"); 
     if(c == d) 
      System.out.println("c & d Both are Equal"); 
     else 
      System.out.println("c & d are Not Equal"); 
    } 
} 

ahora no recibo por qué la salida es tan? la Output es:
a & b Both are equal
c & d are not equal
estoy usando jdk1.7

+1

** Los objetos ** son solo 'iguales' cuando' igual() 'es verdadero. Usar '==' significa que ** referencias ** son lo mismo. –

Respuesta

7

Esto se debe a una optimización en la máquina virtual que asigna números enteros (uso frecuente) pequeño para un grupo de objetos que se reutiliza. This answer explica algunos de los detalles.

4

Parece que el compilador de Java está utilizando valores almacenados en caché para los objetos Integer. Este caché solo se llena para valores de letra pequeña. El valor de 100 está en la memoria caché para que el objeto se reutilice. El valor de 5000 no está en el cache y por eso se crean nuevos objetos cada vez.

La prueba de comparación == para la igualdad de objetos, no la igualdad de valores, por lo tanto, por qué los objetos en caché se consideran iguales y los otros no.

+0

¿se puede probar su declaración? –

+0

Por favor, se más preciso? ¿Qué enunciado debe ser probado? –

+0

Tu propio código es la prueba. –

2

Usted está comparando la dirección de de los Integer objetos usando el operador == y el compilador debe haber simplemente re-utilizado los a y b objetos para la misma variable, pero no los c y d objetos . Si el resultado es la igualdad mediante el método equals, a continuación, obtener los resultados deseados:

public class Test{ 
    public static void main(String args[]){ 
     Integer a = 100; 
     Integer b = 100; 
     Integer c = 5000; 
     Integer d = 5000; 

     System.out.println(a); 
     System.out.println(b); 
     System.out.println(c); 
     System.out.println(d); 
     if(a.equals(b)) 
      System.out.println("a & b Both are Equal"); 
     else 
      System.out.println("a & b are Not Equal"); 
     if(c.equals(d)) 
      System.out.println("c & d Both are Equal"); 
     else 
      System.out.println("c & d are Not Equal"); 
    } 
} 

100 
100 
5000 
5000 
a & b Both are Equal 
c & d Both are Equal 
0

boxeo Conversión conversión de boxeo convierte los valores de tipo primitivo de valores de tipo de referencia correspondiente. En concreto, el 8 de conversión siguiente se llaman las conversiones de boxeo:

de un tipo booleano de tipo booleano De tipo byte a byte de tipo De tipo char al tipo de carácter De tipo corto para escribir corto De tipo int de tipo entero de tipo largo de tipo largo de tipo float de tipo flotador de tipo double para escribir doble en tiempo de ejecución, el producto de conversión de boxeo de la siguiente manera:

Si p es un valor de tipo booleano, la conversión a continuación, el boxeo convierte p en una referencia r de clase y tipo Boolean, tal que r.bo oleanValue() == p Si p es un valor de tipo byte, la conversión de boxeo convierte p en una referencia r de clase y escribe Byte, tal que r.byteValue() == p Si p es un valor de tipo char , la conversión de boxeo convierte p en una referencia r de clase y tipo Character, tal que r.charValue() == p Si p es un valor de tipo short, la conversión de boxeo convierte p en una referencia r de clase y escribe Short , tal que r.shortValue() == p Si p es un valor de tipo int, la conversión de boxeo convierte p en una referencia r de clase y escribe Entero, de modo que r.intValue() == p Si p es un valor de tipo long, luego conversión de box convierte p en una referencia r de clase y tipo Long, de modo que r.longValue() == p Si p es un valor de tipo float then: Si p no es NaN, entonces Convite del boxeo ersion convierte p en una referencia r de clase y tipo Float, de modo que r.floatValue() se evalúa como p . De lo contrario, la conversión de box convierte p en una referencia r de clase y escribe Float tal que r.isNaN() se evalúa como verdadero. Si p es un valor de tipo double, entonces Si p no es NaN, la conversión de box convierte p en una referencia r de clase y escribe Double, de modo que r.doubleValue() evalúa a p De lo contrario, la conversión de box convierte p en una referencia r de clase y tipo Doble tal que r.isNaN() se evalúa como verdadero. Si p es un valor de cualquier otro tipo, la conversión de boxeo es equivalente a una conversión de identidad (5.1.1). Si el valor p que aparece en la casilla es verdadero, falso, un byte, un carácter entre el rango de \ u0000 a \ u007f, o un número entero o corto entre -128 y 127, entonces r1 y r2 serán los resultados de dos acciones de boxeo conversiones de p. Siempre es el caso que r1 == r2 Buena lectura - http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7

Cuestiones relacionadas