2011-12-08 21 views
19

Duplicar posible:
Integer wrapper objects share the same instances only within the value 127?¿Por qué == verdadero para algunos objetos enteros?

he copiado el siguiente fragmento de programa desde el Khalid Mughal SCJP, pero soy incapaz de entender
la salida.

public class RQ200_60 { 
    public static void main(String[] args) { 
     Integer i = -10; 
     Integer j = -10; 
     System.out.print(i==j);   // output: true -- why true? 
     System.out.print(i.equals(j)); // output: true 
     Integer n = 128; 
     Integer m = 128; 
     System.out.print(n==m);   // output: false 
     System.out.print(n.equals(m)); // output: true 
    } 
}  

El programa anterior dando salida verdadera de la primera sentencia print pero supone que debe dar falsa, ya que es referencia de comparación con == operador relacional. Pero la tercera impresión da falso y no entiendo esta inconsistencia.

¡Las explicaciones son muy apreciadas!

+1

http://stackoverflow.com/ preguntas/7309640/compare-two-integer, http://stackoverflow.com/questions/5581913/wrapper-class-and-operator, http://stackoverflow.com/questions/5117132/wrapper-objects-share-the- same-address-space-only-within-the-value-127, http://stackoverflow.com/questions/5865056/integer-construction-variations –

Respuesta

33

En el primer caso, los objetos i y j apuntan al mismo objeto en caché. De forma predeterminada, el rango entre -128 y 127 se almacena en caché como Objeto Integer. Podemos aumentar el rango utilizando JVM arguments

+5

+1 Interesante, no sabía que era configurable. –

+3

Tampoco sabía que es configurable. Los valores de Autoboxed de -128 a 127 * deben * ser idénticos de acuerdo con [JLS 5.1.7] (http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7) – yshavit

8

Entero objetos puede se almacenan en caché para los que representan un valor cercano a 0. (La especificación para la implementación puede darle algunos detalles). Esto es, presumiblemente, para ahorrar memoria (valores cercanos a 0 son comunes, y sería perder mucha memoria para hacer un nuevo objeto para cada variable con el mismo valor).

== comprueba si dos cosas son el mismo objeto; usted puede o no puede tener el mismo objeto entero para dos variables dadas con el mismo valor. Se supone que usted no debe verificar con == porque es que se supone que no le importa si se trata del mismo objeto; lo que importa es el valor de Integer, no su identidad.

11

Las respuestas sobre el almacenamiento en caché son correctas. Sin embargo, si vas ...

Integer i = new Integer(10); 
Integer j = new Integer(10); 

... entonces evitar el almacenamiento en caché y los resultados serán lo que se esperaba.

+0

@pst gracias por la edición. Escribir en mi Nook es un poco incómodo. – user949300

1

Aquí, en este caso el Integer i y Integer j que sostiene los valores enteros que están en el rango de número entero, el rango de una Integer es -128 to 128 y Integer n y Integer m excede el rango de Integer

Cuestiones relacionadas