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

  • Les éléments partagés Android lollipop transition clignotent / flash
  • Envoyer la sortie Logcat d'une application à une adresse électronique
  • Html.ImageGetter TextView
  • Java.lang.NullPointerException (aucun message d'erreur)
  • INSTALL_FAILED_MISSING_SHARED_LIBRARY erreur dans Android
  • Position CSS Android: corrigée après rotation d'un périphérique
  •  /** * 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?

  • Encodage de caractères par défaut Android
  • Pourquoi la taille de ma carte sur le périphérique diffère-t-elle de la taille de la mémoire APK ou Play?
  • Comment puis-je activer des Cookies tiers sous Phonegap et Android 3.2?
  • Qu'est-ce que l'ID TextView dans une mise en page simple_list_item_1 dans Android?
  • EditText, adjustPan, problème ScrollView dans Android
  • Ajuster la taille de la boîte de dialogue personnalisée dans Android
  • 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.