web-dev-qa-db-fra.com

La méthode ArrayList.clear () libère-t-elle de la mémoire?

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?

23
nstosic

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.

13
Karthik T

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.trimToSizeafter clear le tableau de support rétrécit

public void trimToSize() {
    modCount++;
    int oldCapacity = elementData.length;
    if (size < oldCapacity) {
        elementData = Arrays.copyOf(elementData, size);
    }
}
5
Evgeniy Dorofeev

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.

5
Suresh Atta

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.

2
Amol Sonawane