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.