Avant-propos
Hier soir, je voulais ajouter un INT à la table de dictionnaire de la chaîne dans l'application Android. Avis d'éclipse spécifique aujourd'hui.
Utilisez à la place un nouveau sparsarray <string> (...) pour de meilleures performances
Cet avertissement signifie le remplacer en utilisant SparsEarray pour obtenir de meilleures performances.
Code source
Étant donné que le code global de SPARSEARRAY est relativement simple, affichez d'abord le code source, puis analysez pourquoi utiliser SparsEarray a de meilleures performances que l'utilisation de HashMap.
Classe publique SparsArray <e> Implémentez Cloneable {Private Static Object Supped = New Object (); * * Crée une nouvelle SPARSEARRAY contenant aucun mappage qui ne nécessitera même pas une Allcation pour arrêter le nombre de mappages de spécification. RECHERCHE ARLOCAGE. = Nouveau objet [initialCapacity];} mSize = 0;}} @Override @SuppressWarnings ("Unchecked") public SparsEarray <e> clone () {SparsEarray <e> clone = null; ) super.clone (); clone.mkeys = mkeys.clone (); clone.mvalues = mvalues.clon e ();} catch (clonenotsupportdexception cnse) * Obtient l'objet Mapd de la touche de spécification, ou </ null </code> * Si aucun mappage de ce type n'a fait de Ben. obtient l'objet mappé à partir de la touche spécifiée, ou de l'objet spécifié * Si aucun ping a fait. , MSIZE, KEY); La touche Spécifiez, s'il y en avait. ! ;} / ** * Supprime la masse à l'index spécifique. ;} / ** * supprimer les mappages en tant que lot. (mSize, index + size); "SparsArray", "GC commence par" + mSize; ) {objet Value = Values [i]; } o ++;}} marbage = false; Il y en a un. else {i = ~ i; mKeys.length) {gc (); MSIZE + 1); int [] nkeys = new int [n]; à "+ n); system.arraycopy (mKeys, 0, nkeys, mkeys.length); System.arrayCopy (mValues, 0, nvalues, 0, mvalues.length); ys; mValues = nValues;} if (Msize -I! (MVALUES, I, MVALUES, I + 1, MSIZE -I);} MKEYS [i] = KEY; / Public int size () {gc ();} return msize;} / ** * ** * donné dans l'ANGE <code> 0 ... size () -1 </code>, renvoie * la clé de la <code> index </code> mappage de valeur clé que les magasins * SparsArray. Key et <code> keyat (size () -1) </code> renvoie la clé large *. Mkeys [index];} / ** * Étant donné un index dans la plage <code> 0 ... size () - 1 </code>, renvoie * la valeur de l'index <code> index </code> th key- Mappage de valeur que les magasins SPARSEARRAY. Associé à la plus petite clé et à la valeur (taille () -1) </ C. Index) {if (mgarbage) {gc ();} return (e) es [index];} / * * * étant donné un index dans la plage <code> 0 ... size () -1 </code>, Définit une nouvelle valeur * pour le <code> index </code> th mappage de valeurs de clé que cette * SparsEarray ST. } mValues [index] = valeur;} / ** * renvoie l'index pour lequel {@Link {@Link #Keyat} renvoie la clé * spécifiée, ou un nombre négatif si la touche spécifiée * n'est pas mappée. / Public indexofKey (int key) {if (mgarbage) {gc ();} return c onainerherhelpers.binarysearch (mkeys, msize, key);} / ** * renvoie un index pour lequel {@link #valueat} * Clé spécifiée, ou un nombre négatif si aucune touche ne mappe à la valeur spécifiée. Trouver une seule d'entre elles. if (mgarbage) {gc ();} pour (i <mSize; i ++) if (mvalues [i] == valeur) return i; De ce SparsArray. MSIZE = 0; MGARBAGE = FAUX;} / *** met une paire de touches / valeur dans le tableau, E * La clé est supérieure à toutes les clés existantes dans le tableau. if (MSIZE! = 0 && k <= mSize -1]) {put (key, valeur); ) {int n = arrayalintArraySize (pos + 1); int [] nkeys = new int [n]; mKeys.length + "à" + n); nkeys, 0, mkeys.lengle); pos] = key; mvalues [pos] = valeur; Contient Itseel comme une valeur, la bague ST "(cette carte)" * apparaîtra à sa place. Buffer = new StringBuilder (MSIZE * 28); ;} int key = keyat (i); else {buffer.append ("(" ("(" end ('}'); return buffer.toString ();}}
Tout d'abord, regardez le constructeur de SparsEarray:
/ *** crée un nouveau SparsArray ne contenant aucun mappage. * / Public SparsEarray () {this (10);} / *** crée un nouveau SparsEarray Aucun mappage qui * nécessitera une allocation de mémoire supplémentaire pour stocker le numéro * spécifié * de Mappings. ;On peut voir à partir du constructeur que la taille du conteneur est réglée à l'avance, et la taille par défaut est de 10.
Jetons un coup d'œil à l'opération de données ajoutées:
/ ** * Ajoute un mappage à partir de la clé spécifiée à la valeur de spécification, * Repose le mappage précédent à partir de la clé spécifiée si une seule. BinarySearch (mKeys, mSize, key); {mkeys [i] = key; , MSIZE, MSIZE, KEY);} if (MSIZE> = mKeys.Length) {int n = arrayutils.IDEALINTARRAY (MSIZE + 1); .e ("SparsEarray", "Grow" + Mkeys.Length + "à" + n); mValues = nvalues;} if (msize -i! = 0) {// log.e ("sparsearray", "move" + (msize -i)); 1, MSIZE -I);
Regardez la méthode de vérification des données:
/ ** * obtient l'objet mappé à partir de la touche Spécifiez, ou <code> null </code> * Si aucun mappage de ce type. * obtient l'objet mappé à partir de la touche spécifiée, ou de l'objet Spécifier * Si aucune moteur de ce type n'a fait. ));
On peut voir que dans le processus de données de données et d'obtention des données, un algorithme de recherche à double point est uniformément appelé.
Statique int binarysearch (int [] array, int size, int) {int lo = 0; int hi = size -1; 1 ;} Else {return mid; Je pense personnellement que la méthode de (lo + hi) >>> 1 est un peu bizarre, et il est préférable d'utiliser LO + (HI -LO) / 2 directement.