Diferentes implementaciones de HashMap en Android y Java
El problema debería estar en HashMap. Solo puedo verificar el código fuente de HashMap en Java y Android. Descubrí que el método hashCode() de los dos es diferente, pero después. Una mirada más cercana descubrió que Android acaba de optimizar el método hashCode() en Java para que sea más fácil de leer. Pero después de mirar más de cerca, descubrí que Android solo optimizó el método hashCode () de Java para que sea más fácil de leer, pero el principio sigue siendo el mismo, en realidad ==.
}
final int end = recuento de desplazamiento
final char[] caracteres = valor
for (int i = desplazamiento; ; i lt; fin; i) {
hash = 31*hash chars[i];
}
hashCode = hash;
}
devuelve hash;
}
lt;! -- Java--gt;
public int hashCode() {
int h = hash
int len = recuento
;if (h == 0 amp;amp;len gt;0) {
int off = offset;
char val[] = valor;
for (int i = 0; i lt; len; i) {
h = 31*h val[off];
}
hash = h ;
}
return h;
}lt;/codegt;
No me queda más remedio que seguir mirando El código fuente para comparar Finalmente, descubrí que los dos constructores predeterminados son diferentes. La esencia es que los tamaños de las dos tablas son diferentes. El tamaño predeterminado de la tabla en Java es 16 × 0,75 = 12 (capacidad × factor de carga). ), mientras que el tamaño predeterminado de la tabla en Android es 2. Por lo tanto, incluso si las mismas cadenas se colocan en un HashMap en el mismo orden, sus valores clave se almacenarán en un orden diferente.
lt;codegt;lt;! -- Android --gt;
Entrada final estática privada[] EMPTY_TABLE
= new HashMapEntry[MINIMUM_CAPACITY gt; > //Constructor predeterminado
public HashMap() {
table = (HashMapEntrylt; K, Vgt; []) EMPTY_TABLE
umbral = -1; // Fuerza la primera invocación de colocación para reemplazar EMPTY_TABLE
}
lt;! -- Java --gt;
static final int DEFAULT_INITIAL_CAPACITY = 16;
static final float DEFAULT_LOAD_FACTOR = 0.75f;
//Constructor predeterminado
public HashMap() {
this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR);
}lt;/codegt;
De hecho, si lee el código fuente detenidamente, encontrará que la configuración de "umbral" de la clase HashMap implementada en Android es diferente de la de Java. Consulte el código fuente interceptado:
lt;codegt ;lt;! -- Android --gt;
//El umbral se fija en 3/4 del tamaño de su tabla
threshold = (newCapacity gt;gt; 1) (newCapacity gt;gt ; 2 );
lt;! -- Java --gt;
//El umbral es el valor menor entre capacidad * loadFactor o maxCapacity 1
Umbral = (int)Math.min(capacidad * loadFactor, MAXIMUM_CAPACITY 1);