Curiosidade - O que acontece com o objeto?

5 respostas
E

Pessoal,

Tive essa dúvida meio do nada.

A Classe java.util.ArrayList tem um método chamado remove:

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable {

     public E remove (int index) {
          //implementação do método
     }

}

Porém quando eu uso o método remove eu não precisarei do elemento que ele removeu e consequentemente me retornou:

List lista = new ArrayList<>();

//implementação de inclusão dos elementos

lista.remove(2); //Removendo o terceiro elemento

O que acontece com o objeto retornado na linha lista.remove(2);???

Tarefa pro Garbage Collector??

5 Respostas

mauricioadl

Sim, esse objeto não vai mais ter refencia em lugar nenhum, logo o garbage vai pegar ele e “picar o fumo” rsss

Ataxexe

Não necessariamente. Ele não será mais referenciado pela instância de ArrayList, mas ele pode ainda ser referenciado em outro lugar e, se assim for, o Garbage Collector não irá removê-lo da memória.

Um exemplo bestinha:

String s = "string";
List&lt;String&gt; list = new ArrayList();
list.add(s);
list.remove(0); // imagine que o GC passou logo após este ponto

Ali, o objeto estava referenciado pela variável s, logo, o GC não irá coletar o objeto a menos que termine o escopo da variável s.

douglaskd

o List.remove(int index), apaga a referência gravada dentro dela, e da um ultimo suspiro retornando a referência para algum objeto.

class Algo{
	
	public Algo(String texto){
		
		Conteudo = texto;			
		
	}
	
	String Conteudo;
	
}
public class TesteGc{

	public static void main(String[] args) {

		ArrayList<Algo> Lista = new ArrayList();
		
		Algo ab = new Algo("Objeto");
		
		System.out.println(ab); // olhe a referência
		
		Lista.add(ab);
		
		ab = null; //cortando 1 referência, agora apenas a Lista tem a referência de Algo
		
		System.out.println(Lista.get(0));  //olhe a referência

		Algo Salve = Lista.remove(0); //se eu não atribuisse a referência no objeto Salve, o GC teria Exterminado o Objeto da memória

		System.out.println(Salve); //veja que é idêntica à referência acima, provando que é o mesmo objeto
		
		Salve = null; //o GC vai exterminar o objeto Algo, pois perdeu todas as referências

	}

}
mauricioadl

Não necessariamente. Ele não será mais referenciado pela instância de ArrayList, mas ele pode ainda ser referenciado em outro lugar e, se assim for, o Garbage Collector não irá removê-lo da memória.

Um exemplo bestinha:

String s = "string";
List&lt;String&gt; list = new ArrayList();
list.add(s);
list.remove(0); // imagine que o GC passou logo após este ponto

Ali, o objeto estava referenciado pela variável s, logo, o GC não irá coletar o objeto a menos que termine o escopo da variável s.

¬¬
concordo com vc, porem a pergunta do amigo acima subentende que ela nao esta apontando em nenhum outro lugar, somente dentro da lista.

JavaDreams

Recomendo ler o capítulo do Java Use a Cabeça pois explica muito bem isso.

1 - Objeto sem referência é recolhido pelo garbage

2 - Entender a diferença de funcionamento entre referência a objeto feito por um array de tipos
e a referência feita por uma variável de tipo, exige cuidado pois é muito fácil de se confundir…

Estude e observe o funcionamento.

abraço

Criado 16 de agosto de 2013
Ultima resposta 16 de ago. de 2013
Respostas 5
Participantes 5