Je suis curieux de savoir comment les derniers JVMS géreraient la mémoire de collecte de déchets réservée par la méthode suivante.
public List<Player> getHallOfFame() {
ArrayList<Player> listToSort = new ArrayList<Player>(map.values());
Collections.sort(listToSort, comparator);
return listToSort.subList(0, 5);
}
3 Réponses :
oui, La liste retournée est soutenue par cette liste, de sorte que les modifications non structurelles de la liste renvoyée sont reflétées dans cette liste et vice-versa. P>
blockQquote> Donc, le retour d'une sous-liste gardera la liste d'origine d'être déposées collectées. P> Si vous ne voulez pas cet effet, vous devez essentiellement faire une copie du Subliste pertinent. Par exemple: p> subliste code> n'est qu'une "vue" sur la liste existante. Toutes les données sont vraiment dans la liste d'origine. De la documentation:
Merci Jon. La seule raison pour laquelle je pensais que des choses pourraient être différentes, c'est que l'analyse statique peut démontrer que la liste d'origine ne pouvait plus être modifiée.
@CaOilte: Des choses comme la réflexion rendent une telle analyse très difficile.
Je pense que vous avez raison. Puisque le subliste est soutenu par la liste d'origine. Du Java Docs: P>
retourne une vue de la partie de cette liste entre le tidedex spécifié, inclus, et toindex, exclusif. (Si tiindex et toindex sont égaux, le la liste retournée est vide.) Le retour la liste est soutenue par cette liste, donc changements non structurels dans le retour la liste se reflète dans cette liste et vice versa. La liste retournée prend en charge Toutes les opérations de liste optionnelle pris en charge par cette liste. P> blockQuote>
subliste code> crée une nouvelle instance de abstracttractlist.sublist code>, qui conserve une référence à la liste d'origine. Donc, si vous conservez la variable renvoyée par gethalloffame code>, il empêchera le GC de nettoyer listtosort code>. P>
Je penserais que .Lebliste retourne une nouvelle liste et ListToTosort ira à la portée de la portée. Il serait donc recueilli.
@Paul: La documentation indique autrement.
Oui, la clé ici est qu'elle est sauvegardée par la liste d'origine afin que toute modification de la liste d'origine est reflétée dans le subliste.
Voir aussi la mise en œuvre à OpenJDK. DOCJAR.COM/HTML/API/JAVA/UTIL/ABRactList. Java.html
Eh bien, @jon, je dis toujours, lorsque vous allez faire une supposition non informée, vous (ce qui signifie que je) devrait le faire dans un commentaire au lieu d'une réponse. :-)