Prefacio
Anoche quería agregar un INT a la tabla de diccionario de la cadena en la aplicación de Android. Aviso de eclipse específico hoy.
Use nuevo SparsearRay <String> (...) en su lugar para un mejor rendimiento
Esta advertencia significa reemplazarlo usando SparsearRay para obtener un mejor rendimiento.
Código fuente
Debido a que el código general de SparsearRay es relativamente simple, primero muestre el código fuente y luego analice por qué usar SparsearRay tiene un mejor rendimiento que usar HashMap.
Public Class Sparsearry <E> * * Crea un nuevo SparsearRay que no contiene asignaciones que ni siquiera * requerirán que hay Allcation para detener el número de especificación * de las asignaciones. Arlocaciones requeridas. = Nuevo objeto [InicialCapacity];} msize = 0;}} @Override @SupessWarnings ("sin verificar") Public SparsearRay <E> clone () {SparsearrAy <E> clone = null; ) super.clone (); * Obtiene el objeto MAPD de la tecla de especificación, o < / nulo </code> * si no se ha hecho dicha asignación. Obtiene el objeto mapeado de la clave especificada, o el objeto especificar * si no se ha hecho tal ping. , Msize, clave); La clave especificar, si había alguna. ! ;}/ ** *Elimina el mapeo en el índice de especificación. ;} / ** * Eliminar las asignaciones como un lote. (msize, index+size); "Sparsearry", "GC comienza con" + msize; ) {valor de objeto = valores [i]; } o ++;}} mgarbage = false; Hay uno. else {i = ~ i; mkeys.length) {gc (); msize + 1); a " + 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] = clave; / Public int size () {gc ();} return msize;} / ** * ** * dada en el ange <code> 0 ... size () -1 < / code>, devuelve * la clave de la <código> índice </code> th Key-Value Mapping que esto * SparsearRay Stores. Key y <code> KeyAt (size () -1) </code> devolverá la tecla LARGS *. Mkeys [index];}/** * Dado un índice en el rango <código> 0 ... size ()- 1 </code>, devuelve * el valor del <código> índice </code> th key- Mapeo de valor que esta * SparsearRay almacena. Asociado con la * clave y valor más pequeños (size () -1) </ c. Índice) {if (mgarbage) {gc ();} return (e) es [index];} / * * * dado un índice en el rango <código> 0 ... size () -1 </code>, Establece un nuevo valor para el <código> índice </code> th Key-Value Mapping que * SparsearRay st. } mvalues [index] = valor;} / ** * Devuelve el índice para el cual {@link {@link #Keyat} devolvería la clave * especificada, o un número negativo si la clave especificada * no está asignada. / Public IndexOfKey (int key) {if (mgarbage) {gc ();} return c ontainerhelpers.binarySearch (mkeys, msize, key);} / *** devuelve un índice para el cual {@link #valueat} devolvería el * Clave especificada, o un número negativo si no hay claves para el valor * especificado. Encuentra solo uno de ellos. if (mgarbage) {gc ();} para (i <msize; i ++) if (mvalues [i] == valor) return i; de este SparsearRe. msize = 0; if (msize! = 0 && k <= msize -1]) {Put (Key, Value); ) {int n = ArrayAntArsize (pos + 1); mkeys.length + "a" + n); pos] = key; Contiene itseel como un valor, el anillo ST "(este mapa)" * aparecerá en su lugar. Buffer = new StringBuilder (msize * 28); ;} int Key = KeyAt (i); else {buffer.append ("(" ("(" end ('}'); return buffer.ToString ();}}
Primero, mira el constructor de SparsearRay:
/*** Crea una nueva ranura de dispersión que no contiene asignaciones.* /Public sparsearRay () {this (10);} /*** Crea una nueva asignación de SparsearRay sin asignaciones que* requerirán cualquier ascenso de memoria adicional para almacenar el número especificado de Mapeaciones. ;Se puede ver desde el constructor que el tamaño del contenedor se establece por adelantado, y el tamaño predeterminado es 10.
Echemos un vistazo a la operación de datos agregando:
/ ** * Agrega una asignación de la clave especificada al valor de especificación, * Replicando la asignación anterior de la clave especificada si hay una. BinarySearch (mkeys, msize, key); {mkeys [i] = key; , Msize, msize, key);} if (msize> = mkeys.length) {int n = arrayutils.idealintaRaysize (msize + 1); .e ("Sparsearray", "Grow" + mkeys.length + "a" + n); mvalues = nValues;} if (msize -i! = 0) {// log.e ("Sparsearry", "Move" + (Msize -i)); 1, msize -i);
Mire el método para verificar los datos:
/** * Obtiene el objeto asignado desde la clave especificar, o <code> null </code> * si no se asigna tal asignación. * Obtiene el objeto asignado desde la tecla especificada, o el objeto especificar * si no se ha realizado tal mapa. );
Se puede ver que en el proceso de poner datos y obtener datos, se llama de hecho un algoritmo de búsqueda de doble punto.
Static int binarySearch (int [] array, int tamaño, valor int) {int lo = 0; 1 ;} Else {return Mid; // Valor encontrado}} return ~ lo; Personalmente, creo que el método de (LO + HI) >>> 1 es un poco extraño, y es mejor usar LO + (Hi -Lo) / 2 directamente.