Map.clear () vs nouvelle carte: Quelle sera meilleure?

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

Lorsque ma demande nécessite une nouvelle liste de données, je dois effacer la Carte. Mais quand j'ai vu le code de Map.clear () comme

  • Comment formater un double en utilisant les liaisons de données de vue Android?
  • Google App Engine - Cloud Endpoints - Le nom de l'application n'est pas défini
  • Comment faire pour éteindre un appareil Android?
  • Android MapView - définissant automatiquement le zoom jusqu'à ce que tous les objets sont disponibles
  • Mettre à jour les éléments dans un objet JSON
  • Arrêtez Eclipse d'ouvrir Logcat lors de l'exécution d'une application Android
  •  /** * 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 passe en boucle pour n fois (où n est le nombre de données dans Map). Donc, j'ai pensé qu'il pourrait y avoir une façon de redéfinir cette carte en tant que testMap = new HashMap<String, String>(); Et la carte précédemment utilisée sera collectée par les ordures.

    Mais je ne suis pas sûr que ce sera une bonne façon. Je travaille sur une application mobile.

    Pouvez-vous me guider?

  • Dessin sur toile - PorterDuff.Mode.CLEAR dessine noir! Pourquoi?
  • Positionner les exécutables indépendants et Android Lollipop
  • Liste de permissions Android XML complète
  • Android: Où les fichiers de base de données sont-ils stockés?
  • Comment cacher la barre de titre pour une Activité en XML avec un thème personnalisé existant
  • Comment modifier de manière programmatique la couleur primaire dans Android L
  • 7 Solutions collect form web for “Map.clear () vs nouvelle carte: Quelle sera meilleure?”

    Question compliquée. Voyons ce qui se passe.

    Vous instanciez une nouvelle instance, qui est protégée par un nouveau tableau. Ainsi, le collecteur d'ordures devrait effacer toutes les clés et les valeurs de la carte précédente, et effacer la référence à elle-même. Donc, l'algorithme O (n) est exécuté de toute façon, mais dans le fil du collecteur d'ordures. 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 objets, si vous le pouvez. Je vais donc 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 les objets 2*n (Key & Value). Lorsque vous dites null à la même carte, vous demandez au GC de nettoyer les objets 2*n+1 (1 pour la carte). Ensuite, vous devrez créer une nouvelle instance Map encore un autre frais généraux. Alors, allez pour Map.clear() . Vous serez sage de prérégler la taille de la carte tout en l'instanciant.

    Je pensais créer un objet dans java plus cher en termes de mémoire, donc il vaut mieux aller avec .clear() , donc vous utilisez le même objet au lieu de créer un nouveau

    L'idée d'avoir une méthode claire () est d'enlever les références à d'autres objets de la carte, de sorte que la clé / les valeurs ne soient pas bloquées 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.-à-d. «La carte n'est pas« référencée ailleurs »), allez-y et utilisez une nouvelle carte à la place, mais la définition de 1000 références à null ne sera pas une grande performance en tous cas.

    Le map.clear () qui supprime toutes les données. Notez que cela ne supprimera que toutes les entrées, mais gardez le réseau interne utilisé pour stocker les entrées de la même taille (plutôt que de rétrécir à une capacité initiale). Si vous devez également éliminer cela, la manière la plus simple serait de jeter tout le HashMap et de le remplacer par une nouvelle instance. Bien sûr, cela ne fonctionne que si vous contrôlez qui a un pointeur vers la carte.

    En ce qui concerne la récupération de la mémoire, vous devrez laisser le collecteur d'ordures faire son travail.

    Vos valeurs sont-elles aussi longues? Dans ce cas, vous voudrez peut-être regarder une implémentation plus (mémoire) efficace que le HashMap générique, tel que le TLongLongHashMap trouvé dans la bibliothèque GNU Trove . Cela devrait sauver beaucoup de mémoire.

    Je pense que l'appel au nouveau HashMap () est une meilleure idée puisqu'il ne devra pas faire autant de traitement que d'effacer le hashmap. De plus, en créant un nouveau hashmap, vous supprimez la chance que le hashmap soit toujours lié au contrôle qui utilise les données, ce qui causerait des problèmes lors de l'effacement du hashmap.

    N'oubliez pas le repeuplement de la carte

    Si vous ne spécifiez pas la capacité sur la nouvelle carte, vous obtiendrez un peu de frais généraux sur la carte nouvellement créée en raison des rehashes (qui sont O (n) (à l'heure) et arrivent O (log (n)) Fois alors que cela pourrait amortir à O (n) total, mais si elles ne se produisent pas en premier lieu, vous serez toujours mieux)

    Cela n'arrivera pas avec la carte débloquée car la capacité ne change pas

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.