Autoboxing

9 respostas
E
  1. import java.util.ArrayList;
  2. public class BoxingEquality {
  3. public static void main(String[] args) {
    
  4. int i = 2;
    
  5. int j = 2;
    
  6. ArrayList <Integer> list = new ArrayList<Integer>();
    
  7. list.add(i);
    
  8. list.add(j);
    
  9. System.out.printf("It is %b that i ==j.\n",
    
  10. (i==j)); //(1)
    
  11. System.out.printf("It is %b that " +
    
  12. "list.get(0) == list.get(1).\n",
    
  13. list.get(0)==list.get(1)); //(2)
    
  14. System.out.printf("It is %b that " +
    
  15. "list.get(0).equals(list.get(1)).",
    
  16. list.get(0).equals(list.get(1))); //(3)
    
  17. }
    
  18. }

pq os objetos ocupam a mesma posiçãode memoria na situação 1 e 2 da linha 10 e 12 com I e J velendo 2 e substituindo por valores acima de 255 não ocupam a mesma posição

9 Respostas

TangZero

Não me recordo muito bem, mas quando estava estudando para certificação, li algo sobre a JVM utilizar o mesmo objeto do tipo Integer para valores até 128 (ou algo assim), para poder economizar memória.
Ou seja,

// numA e numB apontam para o mesmo endereço de memória.....
Integer numA = 5;
Integer numB = 5;	
if (numA == numB) System.out.println("Iguais...");

// numA e numB apontam para endereços de memória diferentes.....
numA = 255;
numB = 255;
if (numA == numB) System.out.println("Iguais novamente..."); // isso não imprime

Posso estar completamente errado…mas creio que seja isso mesmo! :smiley:

ViniGodoy

É isso mesmo. Existe um cache para objetos de valor até 255.

Por isso, é sempre preferível converter números para Integer usando valueOf (ou autoboxing, que usa valueof) do que usando new Integer(). No último caso, você está dizendo explicitamente que não quer usar o cache.

TangZero

Se eu tivesse errado, iria ficar com uma vergonhaaaaaaaaaa.

E

não entendi
é 128 ou 255???

alucardeck

ediel_xadrez:
não entendi
é 128 ou 255???

255

TangZero

Não estava bem certo quanto ao valor. Mas conhecia a teoria.

ViniGodoy

O cache é de -128 até 127. Exatamente um byte (por isso eu confundi, pensei em unsigned).

Pode testar vc mesmo:

public class Teste { public static void main(String args[]) { for (int i = -129; i < 129; i++) { Integer x = i; Integer y = i; System.out.println(i + ": " + (y == x)); } } }

TangZero

Tudo esclarecido.

peczenyj

Esse cache é por classloader?

Criado 11 de agosto de 2008
Ultima resposta 11 de ago. de 2008
Respostas 9
Participantes 5