Vorwort
Letzte Nacht wollte ich in der Android -Anwendung einen Int in den String -Wörterbuch hinzufügen. Spezifische Eclipse -Bekanntmachung heute.
Verwenden Sie neue Sparsearray <String> (...) stattdessen für eine bessere Leistung
Diese Warnung bedeutet, es mit Sparray zu ersetzen, um eine bessere Leistung zu erzielen.
Quellcode
Da der Gesamtcode von Sparsearray relativ einfach ist, zeigen Sie zunächst den Quellcode an und analysieren Sie, warum die Verwendung von Sparsarray eine bessere Leistung hat als die Verwendung von HashMap.
Öffentliche Klasse sparsarray <e> implementiert klonbar {privates statisches Objekt * * Erstellt ein neues Sparray, das keine Zuordnungen enthält, die nicht einmal * eine y-Allkation erfordern, um die angebene Anzahl von Zuordnungen zu stoppen. ARLOCATIONS = Neues Objekt [initialCapacity];} msize = 0;}} @Override @Suppresswarnings ("Unbekämpft") public sparsearray <e> clone () {sparsearray <e> clone = null; ) super.clone (); * Ruft die Objekt -MAPD aus dem Spezifikationsschlüssel oder < / null < / code> * Wenn kein solcher Mapping erstellt wurde. Erhält das Objekt aus dem angegebenen Schlüssel oder das angebene Objekt *, wenn kein solcher Ping erstellt wurde. , Msize, key); der Schlüssel angeben, wenn es welche gab. ! }/ ** *Entfernt die Abbildung im Index an } / ** * Entfernen von Zuordnungen als Stapel. (msize, index+size) für (int i = index; i <end; i ++) {removeat (i);}}} private viid gc () { / / / / / / log.e (() "Sparsarray", "GC starten" + MSIZE; ) {Objektwert = Werte [i]; } o ++;}} MGARBAGE = MSIZE = O; Es gibt eine. sonst {i = ~ i; MKEYS.Length) {GC (); MSIZE + 1); bis " + n); System.ArrayCopy (MKEYS, 0, NKEYS, MKEYS.LANGEN); System.ArrayCopy (MValues, 0, NValues, 0, mValues.Length); YS; mValues = nValues;} if (msize (msize -i! (MVALUES, I, MVALUES, MSIZE -I); / Public int size () {gc ();} return msize;} / ** * ** * angegeben im Ange <Code> 0 ... size () -1 < / code> retektiert * den Schlüssel aus dem <Code> Index </code> TH-Taste-Wert-Zuordnung, die in diesem * Sparray in der Aufstiegsreihenfolge in der Steigung speichert. Key und <Code> KEYAT (Size () -1) < / code> gibt den Taste von Larges zurück. MKEYS [INDEX];}/** * Bei einem Index im Bereich <Code> 0 ... size ()- 1 </code>, retektiert * den Wert aus dem <Code> Index </code> TH-Tastatur- Value Mapping, die dieses * Sparray speichert. mit dem kleinsten Schlüssel und dem Wert (Size () -1) </ c. Index) {if (mgage) {gc ();} return (e) es [index];} / * * * Angegebene Index im Bereich <code> 0 ... size () -1 < /code>, Legt einen neuen Wert für den <code> index < / code> th-Wert-Mapping fest, das dieses * Sparsearray st. } mValues [index] = value;} / ** * Gibt den Index zurück, für den {@link {@link #key} den angegebenen Taste * oder eine negative Nummer zurückgeben würde, wenn der angegebene * Taste nicht zugeordnet ist. / Public indexofkey (int key) {if (mGerbage) {gc ();} return c ontainerHelPers.BinarySearch (MKEYS, MSIZE, KEY);} / *** Gibt einen Index zurück, für den {@link #Valueat} die zurückgeben würde, die die * Spezifizierter Schlüssel oder eine negative Zahl, wenn keine Schlüsseln zum angegebenen Wert * <p> achten Sie darauf, dass dies eine lineare Suche ist, im Gegensatz zu Suchfunktionen nach Schlüssel * und dass mehrere Tasten demselben Wert zuordnen können, und dies wird * * Finden Sie nur einen von ihnen. if (MGAGBAG) {GC ();} für (i <msize; i ++) if (mValues [i] == value) return i; Aus diesem Sparsarray. msize = 0; if (msize! = 0 && k <= msize -1]) {put (Schlüssel, Wert); ) {int n = arrayalintArraysize (pos + 1); MKEYS.Length + "bis" + n); POS] = KEY; Enthält Itseel als Wert, der ST -Ring "(diese Karte)" wird an seiner Stelle angezeigt. Buffer = new StringBuilder (MSIZE * 28); } int key = keyat (i); sonst {buffer.append ("(" ("(" end ('}'); return buffer.toString ();}}
Schauen Sie sich zunächst den Konstruktor von Sparsearray an:
/*** Erstellt ein neues Sparray, das keine Zuordnungen enthält. Mappings. ;
Aus dem Konstruktor ist ersichtlich, dass die Größe des Containers im Voraus festgelegt und die Standardgröße 10 beträgt.
Schauen wir uns den Hinzufügen von Datenoperationen an:
/ ** * fügt eine Zuordnung aus dem angegebenen Schlüssel zum Wert an *, das die vorherige Zuordnung von der angegebenen Taste veröffentlichen, wenn eine eins ist. */ Publi. Binarysearch (MKEYS, MSIZE, KEY); {MKEYS [i] = key; MSIZE, MSIZE, KEY); .e ("sparsearray", "wachsen" + MKEYS.Length + "bis" + n); mValues = nValues;} if (msize -i! = 0) {// log.e ("sparsearray", "move" + (msize -i)); 1, msize -i);
Sehen Sie sich die Methode zur Überprüfung der Daten an:
/** * Ruft das Objekt aus der Taste an, oder <Code> null </code> *, wenn kein solcher Mapping ist. * Erhält das Objekt aus dem angegebenen Schlüssel oder das Objekt angeben * Wenn keine solche Mapping erstellt wurde. );
Es ist zu erkennen, dass im Prozess der Daten und des Abholens von Daten ein Dual -Point -Suchalgorithmus einheitlich genannt wird.
Statische Int -Binarysearch (int [] Array, int Größe, int Wert) {int lo = 0; 1 1; } Else {return Mid; Ich persönlich denke, dass die Methode von (lo + hi) >>> 1 etwas seltsam ist und es besser ist, LO + (Hi -lo) / 2 direkt zu verwenden.