Kata pengantar
Tadi malam saya ingin menambahkan int ke tabel kamus string di aplikasi Android. Pemberitahuan Eclipse Spesifik Hari Ini.
Gunakan SparseArray baru <string> (...) sebagai gantinya untuk kinerja yang lebih baik
Peringatan ini berarti menggantinya menggunakan SparseArray untuk mendapatkan kinerja yang lebih baik.
Kode Sumber
Karena keseluruhan kode SPARSEARRAY relatif sederhana, pertama menunjukkan kode sumber, dan kemudian menganalisis mengapa menggunakan SPARSEARRAY memiliki kinerja yang lebih baik daripada menggunakan HashMap.
Public SparseArray <e> mengimplementasikan Objek Final Static yang dapat dikloning = objek baru (); * * Membuat SPARSEARRAY baru tidak ada pemetaan yang bahkan tidak akan * memerlukan allasi y untuk menghentikan spesifikasi * jumlah pemetaan. REVERING ARLOKASI = Objek baru [InitialCapacity];} MSize = 0;}} @Override @suppressWarnings ("Uncecked") Public SPARSEARRAY <E> klon () {sparseArray <E> klon = null; ) super.clone (); clone.mkeys = mkeys.clone (); * Mendapatkan objek MAPD dari kunci spesifikasi, atau </null </code> * Jika tidak ada pemetaan seperti itu yang dibuat oleh Ben. Mendapatkan objek yang dipetakan dari kunci yang ditentukan, atau objek tertentu * jika tidak ada ping seperti itu. , Msize, key); if (i <0 || mvalues [i] == ted) {return valueifkeynotfound;} else {return (e) mVALUES [i];} / ** * Menghapus pemetaan dari Tentukan kunci, jika ada. = Dihapus) {MVALUES [i] = Dihapus; ;}/ ** *Menghapus peta pada indeks tertentu ;} / ** * Hapus pemetaan sebagai batch. (msize, index+size); untuk (int i = index; i <end; i ++) {removeat (i);}}}} private viid gc () { / / / / / / / log.e ( "SPARSEARRAY", GC mulai dengan " + MSIZE; ) {nilai objek = nilai [i]; if (nilai! = Dihapus) {if (i! = o) {key [o] = Kunci [i]; } o ++;}} mgarbage = false; ada satu. else {i = ~ i; if (i <msize && mValues [i] == Dihapus) {mkeys [i] = key; mkeys.length) {gc (); MSIZE + 1); untuk " + n); System.arraycopy (mkeys, 0, nkeys, mkeys.length); System.arraycopy (mValues, 0, nvalues, 0, mvalues.length); ys; mValues = nvalues;} if (mSizeze -i! (MVALUS, I, MVALUS, I+1, MSIZE -I);} MKEYS [I] = KEY; / Public int size () {gc ();} return msize;} / ** * ** * diberikan dalam Ange <code> 0 ... size () -1 </code>, mengembalikan * kunci dari <code> indeks </code> pemetaan nilai kunci bahwa ini * SPARSEARRAY Stores. Kunci dan <code> keyat (size () -1) </code> akan mengembalikan key Large *. Mkeys [index];}/** * Diberikan indeks dalam kisaran <code> 0 ... size ()- 1 </code>, mengembalikan * nilai dari <code> indeks </code> key- Pemetaan Nilai bahwa ini * SPARSEARRAY menyimpan. terkait dengan * kunci terkecil dan nilai (size () -1) </ c. Indeks) {if (mgarbage) {gc ();} return (e) es [index];} / * * * Diberikan indeks dalam rentang <code> 0 ... size () -1 </code>, Menyetel nilai * baru untuk <code> indeks </code> pemetaan key-value bahwa * sparseArray st. } MVALUES [INDEX] = Value;} / ** * Mengembalikan indeks yang {@link {@link #keyat} akan mengembalikan kunci * yang ditentukan, atau nomor negatif jika kunci * yang ditentukan tidak dipetakan. / IndexOfKey publik (key int) {if (mgarbage) {gc ();} return c ontainerhelpers.binarySearch (mkeys, msize, key);} / *** Mengembalikan indeks yang {@link #valueat} akan mengembalikan tersebut * Kunci yang ditentukan, atau nomor negatif jika tidak ada tombol peta ke * nilai yang ditentukan. Temukan salah satu dari mereka. if (mgarbage) {gc ();} untuk (i <msize; i ++) if (mValues [i] == nilai) return i; Dari SPARSEArray ini. MSIZE = 0; if (msize! = 0 && k <= msize -1]) {put (key, value) ) {int n = arrayalintarraysize (pos + 1); mkeys.length + "to" + n); POS] = Key; Berisi iTseel sebagai nilai, cincin ST "(peta ini)" * akan muncul di tempatnya. Buffer = New StringBuilder (MSIZE * 28); ;} int key = keyat (i); else {buffer.append ("(" ("(" end ('}'); return buffer.toString ();}}
Pertama, lihat konstruktor SPARSEARRAY:
/*** Membuat SparseArray baru yang tidak mengandung pemetaan.* /Public sparseArray () {this (10);} /*** Membuat sparseArray baru tidak ada pemetaan yang akan* memerlukan alokasi memori tambahan untuk menyimpan jumlah* yang ditentukan dari jumlah yang ditentukan Jika Anda mendukung kapasitas awal 0, array spars akan diinisialisasi dengan alokasi array ddision yang ringan. ;Dapat dilihat dari konstruktor bahwa ukuran wadah diatur terlebih dahulu, dan ukuran default adalah 10.
Mari kita lihat operasi penambahan data:
/ ** * Menambahkan pemetaan dari kunci yang ditentukan ke nilai tertentu, * Mengganti pemetaan sebelumnya dari kunci yang ditentukan jika ada satu. BinarySearch (mkeys, MSIZE, KEY); {mkeys [i] = key; , MSIZE, MSIZE, KUNCI);} if (msize> = mkeys.length) {int n = arrayutils.idealintarraysize (MSIZE + 1); .e (sparseArray "," Grow " + mkeys.length +" to " + n); MVALUES = nVALUES;} if (msize -i! = 0) {// log.e ("sparseArray", "move" + (msize -i)); 1, MSIZE -I);
Lihatlah metode memeriksa data:
/** * Mendapatkan objek yang dipetakan dari tombol spesifik, atau <code> null </code> * Jika tidak ada pemetaan seperti itu. * Mendapatkan objek yang dipetakan dari kunci yang ditentukan, atau objek tertentu * jika tidak ada peta seperti itu. ); if (i <0 || mvalues [i] == dihapus) {return valueifkeynotfound;} else {return (e) mValues [i];}}
Dapat dilihat bahwa dalam proses menempatkan data dan mendapatkan data, algoritma pencarian ganda disebut secara seragam.
Static Int BinarySearch (int [] array, ukuran int, nilai int) {int lo = 0; 1; ;} Else {return mid; Saya pribadi berpikir bahwa metode (lo + hai) >>> 1 agak aneh, dan lebih baik menggunakan lo + (hai -lo) / 2 secara langsung.