La mémoire Java HashMap.clear () et remove () est-elle efficace?

Considérons le HashMap.clear() suivant HashMap.clear() :

  /** * Removes all of the mappings from this map. * The map will be empty after this call returns. */ public void clear() { modCount++; Entry[] tab = table; for (int i = 0; i < tab.length; i++) tab[i] = null; size = 0; } 

Il semble que le tableau interne ( table ) d’objects Entry ne soit jamais réduit. Ainsi, lorsque j’ajoute 10000 éléments à une carte, et après cet appel, map.clear() , il conservera 10000 valeurs nuls dans son tableau interne. Alors, ma question est la suivante: comment JVM ne gère-t-elle pas ce tableau? La mémoire HashMap est- HashMap efficace?

L’idée est que clear() est uniquement appelé lorsque vous souhaitez réutiliser le HashMap . La réutilisation d’un object ne doit être effectuée que pour la même raison que celle utilisée auparavant. Il est donc probable que vous aurez à peu près le même nombre d’entrées. Pour éviter les rétrécissements et les redimensionnements inutiles de la Map la capacité est maintenue quand on appelle clear() .

Si tout ce que vous voulez faire est de supprimer les données de la Map , alors vous n’avez pas besoin d’appeler clear() , mais effacez simplement toutes les références à la Map elle-même, auquel cas elle sera supprimée. finalement.

En regardant le code source , il semble que HashMap ne diminue jamais. La méthode de resize est appelée pour doubler la taille si nécessaire, mais elle n’a rien ala ArrayList.sortingmToSize() .

Si vous utilisez une HashMap de manière à ce qu’elle grandisse et se réduise souvent, vous pouvez créer un nouveau HashMap au lieu d’appeler clear() .

Vous avez raison, mais étant donné que l’augmentation de la taille de la baie est une opération beaucoup plus coûteuse, il n’est pas déraisonnable que HashMap pense “une fois que l’utilisateur aura augmenté la masortingce, il aura probablement besoin de cette taille plus tard”. le tableau au lieu de le diminuer et risquer de devoir le développer plus tard plus tard. Je suppose que c’est une heuristique – vous pouvez également préconiser le contraire.

Une autre chose à considérer est que chaque élément du table est simplement une référence. Définir ces entrées sur null supprimera les références des éléments de votre Map , qui seront alors libres pour la récupération de place. Donc, ce n’est pas comme si vous ne libériez aucune mémoire.

Toutefois, si vous avez besoin de libérer même la mémoire utilisée par la Map elle-même, libérez-la conformément à la suggestion de Joachim Sauer.