Map.clear () vs nouvelle carte: Lequel sera le meilleur?

J’ai une syntaxe Map as comme Map testMap = new HashMap(); . Dans cette carte, il peut y avoir 1000 données.

Lorsque mon application nécessite une nouvelle liste de données, je dois effacer la carte. Mais quand j’ai vu le code de Map.clear () comme

 /** * 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; } 

Je me rends compte que la méthode claire va en boucle pour n fois (où n est le nombre de données dans Map). J’ai donc pensé qu’il était possible de redéfinir cette carte comme testMap = new HashMap(); et la carte précédemment utilisée sera collectée.

Mais je ne suis pas sûr que ce soit un bon moyen. Je travaille sur une application mobile.

Pouvez-vous me guider s’il vous plaît?

Question compliquée Voyons ce qui se passe.

Vous instanciez une nouvelle instance, qui est sauvegardée avec un nouveau tableau. Ainsi, le garbage collector doit effacer toute la clé et toutes les valeurs de la carte précédente et effacer la référence à lui-même. Donc, l’algorithme O (n) est exécuté de toute façon, mais dans le thread du ramasse-miettes. Pour 1000 enregistrements, vous ne verrez aucune différence. MAIS. Le guide de performance vous indique qu’il est toujours préférable de ne pas créer de nouveaux objects , si vous le pouvez. Donc, j’irais avec la méthode clear() .

Quoi qu’il en soit, essayez les deux variantes et essayez de mesurer. Toujours mesurer!

Lorsque vous dites Map.clear() sur une carte de taille n … Vous demandez au GC de nettoyer 2*n objects 2*n (Key & Value). Lorsque vous dites null à la même carte, vous demandez au GC de nettoyer les objects 2*n+1 (1 pour la carte elle-même). Ensuite, vous devrez créer une nouvelle instance de carte encore une autre fois. Alors, allez pour Map.clear() . Vous serez sage de prérégler la taille de la carte tout en l’instanciant.

Je pensais que créer des objects en Java était plus coûteux en termes de mémoire, il vaut donc mieux que vous .clear() , donc vous utilisez le même object au lieu d’en créer un nouveau

L’idée d’avoir la méthode clear () consiste à supprimer les références à d’autres objects de la carte, de sorte que la clé / les valeurs ne soient pas bloquées par le gcing si la “carte est référencée ailleurs”.

Mais si votre carte est une carte locale utilisée uniquement par votre code spécifique (c’est-à-dire que “map n’est pas référencée ailleurs”), alors utilisez une nouvelle carte à la place. en tous cas.

Le map.clear () qui supprimera toutes les données. Notez que cela ne supprimera que toutes les entrées, mais gardera le tableau interne utilisé pour stocker les entrées à la même taille (plutôt que de réduire à une capacité initiale). Si vous devez également éliminer cela, le plus simple serait de supprimer l’ensemble de HashMap et de le remplacer par une nouvelle instance. Cela ne marche bien sûr que si vous contrôlez qui a un pointeur sur la carte.

En ce qui concerne la récupération de la mémoire, vous devrez laisser le garbage collector faire son travail.

Vos valeurs sont-elles aussi longues? Dans ce cas, vous souhaiterez peut-être envisager une implémentation plus efficace (mémoire) que le HashMap générique, tel que le TLongLongHashMap présent dans la bibliothèque GNU Trove . Cela devrait permettre d’économiser beaucoup de mémoire.

Je pense qu’appeler new HashMap () est une meilleure idée car cela ne nécessitera pas autant de traitement que d’effacer le hashmap. De plus, en créant un nouveau hashmap, vous supprimez la possibilité que le hashmap soit toujours lié au contrôle qui utilise les données, ce qui entraînerait des problèmes lorsque le hashmap doit être effacé.

n’oublie pas le repeuplement de la carte

Si vous ne spécifiez pas la capacité sur la nouvelle carte, vous obtiendrez un peu de surcharge sur la nouvelle carte à cause des rehashes (qui sont O (n) (à ce moment) et se produisent O (log (n)) fois pendant que cela pourrait amortir à O (n) total, mais si elles ne se produisent pas en premier lieu, vous serez toujours mieux de)

cela ne se produira pas avec la carte effacée car la capacité ne change pas