Si je ne me trompe pas, ArrayList contient la valeur des emplacements de mémoire dans lesquels les variables que vous avez ajoutées à la liste sont stockées. Donc, mon hypothèse est que lorsque vous appelez la méthode ArrayList.clear (), cela libère uniquement les valeurs susmentionnées (des emplacements de mémoire) mais ne libère pas ces emplacements de mémoire eux-mêmes. Je vais essayer d'illustrer cela avec un exemple:
Disons que vous avez l'état actuel de la mémoire:
[Memory location] (type of variable) *value*
[1000] (int) 32
[1002] (int) 12
[1003] (float) 2.5
Et vous les ajoutez à la liste myList, afin qu'elle contienne des pointeurs vers les emplacements de mémoire 1000, 1002, 1003.
Lorsque vous appelez myList.clear (), les pointeurs seront annulés, mais les emplacements de mémoire 1000, 1002, 1003 contiendraient toujours les valeurs précédemment données. Ai-je tort?
Vous avez raison, car la mémoire est effacée de manière asynchrone par le garbage collector et non directement par ces fonctions de bibliothèque. clear
ne ferait que null
tout sortir et mettrait à jour l'état ArrayList
en conséquence.
Si certains ou tous ces éléments ne sont pas référencés par une autre partie de votre code, ils deviennent éligibles pour la collecte des ordures et peuvent être détruits + désaffectés à tout moment de peu de temps après cet appel jusqu'à la fin des temps.
clear
uniquement les éléments de tableau de support nulls
public void clear() {
modCount++;
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
mais si nous appelons ArrayList.trimToSize
after clear
le tableau de support rétrécit
public void trimToSize() {
modCount++;
int oldCapacity = elementData.length;
if (size < oldCapacity) {
elementData = Arrays.copyOf(elementData, size);
}
}
Non, cela n'effacera pas la mémoire. Après avoir clear()
.
Voir le code source de clear ()
public void More ...clear() {
modCount++;
// Let gc do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
La méthode rend les éléments éligibles pour Garbage Collector, et non pas immédiatement. Une fois GC exécuté, ils sont partis.
La réponse à votre question, ce ne sera pas FREE
la mémoire. Il supprimera simplement tous les object references
. Maintenant, ces objets peuvent ou non être collectés par le collecteur garbage
selon la façon dont ils sont référencés à d'autres endroits.
Par exemple,
Object 1 refers - > Object 2
ArrayList refers - > Object 2
ArrayList refers - > Object 3
Dans ce cas, après Arraylist.clear()
, l'objet 3 sera éligible pour clean-up
Mais pas l'objet 2.