List+Autoboxing +for aprimorado nao funciona

5 respostas
acjZer0

Opa galera tudo bem , procurei no fórum e no google mas não consegui localizar nada que me ajudasse,
assim estou tentando atualizar objetos de uma List que criei de Integers, como são objetos eu atualizando uma referencia, deveria modificar o mesmo
porem nao sei pq nao funciona alguem poderia me dizer aonde estou cometendo a burrada :roll: , valeu pessoal muito Obrigado.

public class Teste
{

	List<Integer> pares = new ArrayList<Integer>();

void populaListas()
{
	
	pares.add(1);
	
	pares.add(3);
	
	pares.add(7);
	
	pares.add(9);
	
	pares.add(11);
}

public static void main(String args[])
{

       Teste estaClasse = new Teste();

        estaClasse.populaListas();


	for(Integer numeroAtual : estaClasse.pares)
	{
			
			++numeroAtual;

	}

System.out.println("Os pares sao:"+estaClasse.pares);


}
}

A saida e Os pares sao: 1 3 7 9 11

:shock:

5 Respostas

Lavieri
acjZer0:
Opa galera tudo bem , procurei no fórum e no google mas não consegui localizar nada que me ajudasse, assim estou tentando atualizar objetos de uma List que criei de Integers, como são objetos eu atualizando uma referencia, deveria modificar o mesmo porem nao sei pq nao funciona alguem poderia me dizer aonde estou cometendo a burrada :roll: , valeu pessoal muito Obrigado.

e ele modifica a referecia ^^

for(Integer numeroAtual : estaClasse.pares)   
    {   
               
            numeroAtual++;   
            //veja que a referencia foi modificada
           System.out.println(numeroAtual);
    }

o fato é que vc não muda o conteudo da lista, pois a lista tem a sua copia da referencia, enquanto o numeroAtual tem a dele... cada um tem uma cópia da referencia, alterar uma referencia não implica em alterar a outra.... c vc tivesse alterando o conteúdo do objeto ai tudo bem, porem Integer é um objeto de estado final, portanto é impossivel alterar seu conteúdo

acjZer0

pelo o que entendi ele cria um novo objeto quando uso tento incrementar o mesmo"++"???

Lavieri

sim cria um novo, e atribui o novo a “numeroAtual” …

na verdade existe varias coisas que o compilador faz implicitamente…

ele primeiro faz um outbox, ou seja… ele descompacta o Integer, usando numeroAtual.intValue() … depois ele pega esse int recebido e incrimenta ela em 1 unidade… depois ele cria um novo objeto integer, new Integer(numeroAtual.intValue()), e depois ele atribui a numeroAtual …

enfim seria o mesmo que escrever

numeroAtual++; // é o mesmo que numeroAtual = new Integer(numerAtual.intValue() + 1); //o compilador faz isso implicitamente na instrução acima

acjZer0

(pelo que vi cria outro objeto sim)

pelo livro SCJP 5 (Kathy Sierra e Bert Bates)
assim funciona o Autoboxing :

//assim que funciona intenamente o Incremento de um Integer
//exemplo Integer i =5;
// i++


Integer y = new Integer (567); // cria uma Inetegr
int x = y.intValue(); // abre o mesmo
x++ ;// incrementa
y = new Integer(x); //fecha novamente
//Com isso se cria um novo objeto por isso nao posso referenciar ao mesmo.

Solução:

package threads;

import java.util.ArrayList;
import java.util.List;

public class Teste
{



  List<Integer> pares = new ArrayList<Integer>();



   void populaListas()
   {

       pares.add(1);

       pares.add(3);

       pares.add(7);

       pares.add(9);

       pares.add(11);
   }


    public static void main(String args[])
    {

           Teste estaClasse = new Teste();

            estaClasse.populaListas();


        for(int i =0; i< estaClasse.pares.size();i++)
        {
            Integer w = estaClasse.pares.get(i);
        	w++;
            estaClasse.pares.set(i,w);

        }

    System.out.println("Os pares sao:"+estaClasse.pares);


    }
    }

Muito Obrigado Pela Ajuda ^^.

acjZer0

favor apagar este.

Criado 20 de abril de 2009
Ultima resposta 20 de abr. de 2009
Respostas 5
Participantes 2