Integer

Estou com uma duvida, estou estudando wrapper, qual a diferença entre: Integer i = 10 e Integer i = new Integer(10)


Integer i = 10;
Integer i2 =10;
		
System.out.println(i ==i2);
System.out.println(i !=i2);
System.out.println(i.equals(i2));

//imprime true , false , true


Integer i = new Integer(10);
Integer i2 =new Integer(10);
		
System.out.println(i ==i2);
System.out.println(i !=i2);
System.out.println(i.equals(i2));

//imprime  false , true ,true

Obrigado…

A diferença é que na forma :

Integer i = 10

ocorre o chamado auto-boxing, isso é, o compilador cria um objeto do tipo Integer automaticamente. O inverso também é válido:

int j = Integer.valueOf(20);

ou seja, um objeto Integer é convertido automaticamente para um primitivo int.

Ocorre que nos casos de auto-boxing o compilador otimiza o uso de objetos. Como objetos de wrapper classes são imutáveis, pode-se perfeitamente usar um único objeto para um único valor, e foi isso que o compilador fez. No seu caso, como tanto i e i2 devem referenciar um objeto Integer de valor 10, é usado um único objeto. Se eu não me engano, e é um teste interessante de se fazer, você obtém o mesmo efeito usando o método valueOf ao invés de usar o construtor, pois como você pode ver, ao usar explicitamente o construtor, você pode criar diversos objetos para o mesmo valor, o que é um desperdício de memória.

Tem a questao tb do range que o Integer usa pra criar um novo objeto, se vc fizer o teste disso por exemplo dará false:

[code]Integer a = 128;
Integer b = 128;

System.out.println(a == b);[/code]

Olha essa…


int i =10;

int i2 =10;


metodo(i , i2);

}

void metodo(Integer i , Integer i2){
System.out.println(i == i2); 
}

Na comparação estamos comparando objetos do tipo Integer ou um primitivo int?

[quote=tinorberto]Olha essa…


int i =10;

int i2 =10;


metodo(i , i2);

}

void metodo(Integer i , Integer i2){
System.out.println(i == i2); 
}

Na comparação estamos comparando objetos do tipo Integer ou um primitivo int? [/quote]

Dentro do metodo estao sendo comparados objetos wrappers Integers, no caso se vc passar um numero entre 0 e 127 sera criado apenas um objeto Integer, onde se vc fizer esta comparaçao dará true.

[quote=tinorberto]Olha essa…


int i =10;

int i2 =10;


metodo(i , i2);

}

void metodo(Integer i , Integer i2){
System.out.println(i == i2); 
}

Na comparação estamos comparando objetos do tipo Integer ou um primitivo int? [/quote]

Se vc está estudando pelo livro da Kathy Sierra, provavelmente deve ter passado lido sobre “ampliação”.
A partir do momento que vc faz:


public void metodo(Integer x){....;}
int i = 1;
metodo(i);

A classe Integer faz o auto-boxing, algo equivalente a:

Integer x = new Integer(1);

Ou seja, a variavel “x” neste momento representa um objecto, não um tipo primitivo.