Lorsque je supprime 1 objet de ArrayList en Java. Ce qui arrive ensuite?


J'ai une arraylist simple comme celle-ci: ..

ArrayList<SP> sps = new ArrayList<SP>();
sps.add(new SP("1"));
sps.add(new SP("2"));
sps.add(new SP("3"));

.. Lorsque je supprime 1 objet de cette liste. Ce qui arrive ensuite? Cette liste supprime simplement la référence de cet objet et puis l'objet libère automatiquement cette zone de mémoire (parce que rien ne fait référence à cette mémoire de cet objet) ou cet objet a été libéré directement de cette zone de mémoire par cette liste ?

P/s:Désolé pour mon mauvais anglais.

Author: Paul Sweatte, 2017-02-25

4 answers

Si vous appelez ArrayList.remove() l'élément à l'index est supprimé de la liste (ainsi que tous les éléments suivants descendre d'un indice). L'objet lui-même existe toujours, aucune mémoire n'a encore été libérée.

S'il n'y a plus de références à cet objet dans votre application après que l'objet a été supprimé de la liste-ce qui signifie qu'il est maintenant inutilisé par votre programme-le Garbage Collector {[3] } libérera automatiquement la mémoire associée à cet objet afin qu'il puisse être réutiliser.

 8
Author: dimo414, 2017-05-23 12:17:32

Quelques choses se produisent, à la fois à la ArrayList et à l'objet supprimé.

Quand ArrayList.remove() est appelé, il supprime en effet la référence à cet objet, de la ArrayList. De plus, le contenu procédant à l'élément supprimé est décalé d'un vers le bas.

S'il n'y a pas d'autres références restantes à cet objet, la mémoire allouée à l'objet peut maintenant être libérée dans un processus automatisé appelé Garbage Collection

Exemple:

ArrayList<Integer> example = otherArrayList; // {2,3,10,6}
example.remove(1);                           // Remove second element
System.out.println(example.toString());

> [2, 10, 6]                                 // '3' is now eligible for GC

Exemple d'un objet inéligible pour GC:

ArrayList<Integer> example = otherArrayList; // {2,3,10,6}
int ref = example.get(1);                    // '3' is assigned to ref
example.remove(1);                           // Remove second element
System.out.println(example.toString());
System.out.print(ref); 
// ref = example.get(1) = 3, therefore it is ineligible for GC

> [2, 10, 6] 
> 3
 4
Author: Arcaeic, 2017-02-25 09:55:32

Cette liste supprime simplement la référence de cet objet, puis object auto relâchez cette zone mémoire (car rien ne fait référence à cette mémoire de cet objet) ou cet objet a été libéré directement à partir de cette mémoire zone par cette liste ?

JVM ne fonctionne pas de cette façon.

1) Alors qu'un objet est référencé par un objet vivant dans la mémoire, il n'est pas éligible pour GC.

2) Même si un objet n'est plus référencé par un objet vivant dans la mémoire, le la libération de mémoire n'est pas automatique.
Il ne sera publié que lorsqu'une collecte de gargouillis (mineure ou complète) est effectuée par le Garbage collector.

 1
Author: davidxxx, 2017-02-25 09:09:47
ArrayList<SP> sps = new ArrayList<SP>();

Ce que cela signifie, c'est que, il y a un ArrayList de type SP et chaque index de cette ArrayList est un type de SP, en bref, il sera une variable de référence de SP.

Maintenant, vous appelez new SP("1");, un object to SP sera créé et le constructeur retourne la référence de cet objet. Mais ici, il n'y a pas de variable de référence compatible affectée à new SP("1");. De sorte que l'objet ne peut pas être plus accessible.

Mais dans votre ArrayList (pour la même instruction), il y aura une référence à accepter le retour du constructor of SP. Ainsi, lorsque vous supprimez cet objet de la liste, il perd sa seule référence et devient éligible à la récupération de place.

Refernce: Appeler des méthodes sur une variable de référence vs Appeler des méthodes sur un nouvel objet

 0
Author: Arun Sudhakaran, 2018-03-24 09:12:29