Предисловие
Прошлой ночью я хотел добавить Int в словарную таблицу строки в приложении Android. Конкретное уведомление о затмении сегодня.
Используйте New Sparsearray <string> (...) вместо этого для лучшей производительности
Это предупреждение означает заменить его, используя SparsEarray, чтобы получить лучшую производительность.
Исходный код
Поскольку общий код SparseArray относительно прост, сначала покажите исходный код, а затем анализируйте, почему использование SparsEarray имеет лучшую производительность, чем использование HashMap.
Общественный класс SpareErray <e> Осуществляет клонируемый {частный статический объект. * * Создает новый SparseArray, не связанный с сопоставлением, которые даже не требуют какого-либо y allcation, чтобы остановить указание * количество отображений. Регистрация Arlocations = Новый объект [initialCapacity];} msize = 0;}} @Override @suppresswarnings ("unchecked") public sparsearray <e> clone () {sparsearray <e> clone = null; ) super.clone (); * Получает MAPD объекта из клавиши спецификации или < / null < / code> * Если такого отображения не сделано. Получите объект, отображаемый из указанного ключа, или объект указания *, если такого пинга не было. , Msize, key); Укажите ключ, если есть. ! = Удален) {mvalues [i] = DELETED; ;}/ ** *Удаляет картину в индексе указания ;} / ** * Удалить сопоставления как партия. (msize, index+size); «SpareErray», «GC начинается с" + msize; {object value = values [i]; } o ++;}} mgarbage = false; есть один. else {i = ~ i; mkeys.length) {gc (); msize + 1); к " + n); System.Arraycopy (Mkeys, 0, nkeys, mkeys.length); System.Arraycopy (mvalues, 0, nvalues, 0, mvalues.length); ys; mvalues = nvalues;} if (msize.length); ys; mvalues = nvalues; -i! (mvalues, i, mvalues, i+1, msize -i);} mkeys [i] = ключ; / Public int size () {gc ();} return msize;} / ** * ** * * Дано в Ange <code> 0 ... size () -1 < / code>, возвращает * ключ из <code> index </code> Th-значения клавиш, что это * Sparsearray. Ключ и <code> keyat (size () -1) < / code> вернет ключ Larges *. Mkeys [index];}/** * Указанный индекс в диапазоне <code> 0 ... size ()- 1 </code>, возвращает * значение из <code> index </code> th клавиша- Сопоставление значений, которое это * SparsEarray хранит. Связано с * наименьшим ключом и значением (Size () -1) </ c. Index) {if (mgargbage) {gc ();} return (e) es [index];} / * * * Указал индекс в диапазоне <code> 0 ... size () -1 < /code>, Устанавливает новое значение * для <code> Index < / code> th-клавиш. } mvalues [index] = value;} / ** * Возвращает индекс, для которого {@link {@link #keyat} будет возвращать указанный ключ *, или отрицательный номер, если указанный * ключ не отображается. / Public indexofkey (int key) {if (mgargbage) {gc ();} return c ontainerhelpers.binarysearch (mkeys, msize, key);} / *** Возвращает индекс, для которого {@link #valueat} будет возвращать * Указанный ключ или отрицательное число, если нет клавишных карт для * указанного значения. Найдите только один из них. if (mgarbage) {gc ();} for (i <msize; i ++) if (mvalues [i] == value) return i; Из этого SpareArray. msize = 0; if (msize! = 0 && k <= msize -1]) {put (Key, значение); {int n = arrayalintarraysize (pos + 1); mkeys.length + " + n); POS] = Key; Содержит Itseel как значение, ST Ring "(эта карта)" * появится на своем месте. Buffer = new StringBuilder (msize * 28); ;} int key = keyat (i); else {buffer.append ("(" ("(" end ('}'); return buffer.tostring ();}}
Во -первых, посмотрите на конструктор SparseArray:
/*** Создает новый SparsEarray, не содержащий сопоставления. Сопоставления. ;
Из конструктора можно увидеть, что размер контейнера установлен заранее, а размер по умолчанию составляет 10.
Давайте посмотрим на работу добавления данных:
/ ** * Добавляет отображение из указанного ключа к значению указания, * Replaing предыдущее отображение из указанного ключа, если есть один. BinarySearch (MKEYS, MSIZE, KEY); {mkeys [i] = key; , Msize, msize, key);} 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);
Посмотрите на метод проверки данных:
/** * Получил объект, отображаемый из клавиши указания, или <code> null </code> * Если нет такого отображения. * Получите объект, отображаемый из указанного ключа, или объект указания * Если такая картинка не сделана. );
Можно видеть, что в процессе посадки данных и получения данных в двойном точечном алгоритме выполняется равномерно.
Static int binarysearch (int [] массив, int size, int value) {int lo = 0; 1; ;} Else {return Mid; Я лично думаю, что метод (lo + hi) >>> 1 немного странно, и лучше использовать LO + (hi -lo) / 2 напрямую.