Mirando a diferentes constructores de colecciones, me viene a la mente la pregunta. ¿Por qué ArrayList () construye una lista vacía con una capacidad inicial de diez y ArrayDeque () construye una matriz de vacío vacía con una capacidad inicial suficiente para contener 16 elementos?
java
collections
Viejo badman gris
fuente
fuente
Respuestas:
Respuesta corta
Debido a que la capacidad de ArrayDeque debe ser una potencia de dos, y 16 es la potencia más pequeña de dos que es al menos 10.
ArrayDeque necesita usar muchas operaciones% en todas partes para envolver una matriz lineal que pretende ser circular.
a % b
se puede expresar comoa & (b - 1)
si fuerab
una potencia de dos. El AND a nivel de bits es masivamente más rápido, por lo que la capacidad de ArrayDeque se limita a la potencia de dos. Todas las operaciones% se realizan con máscara de bits en lugar de% real en la implementación.Esta es también la razón por la cual el HashMap más nuevo no usa tamaños de tabla de números primos sino potencia de dos , nuevamente porque el% de operación debe realizarse con tanta frecuencia y a nivel de bits y es mucho más rápido.
Entonces, si la línea de base es 10, entonces las estructuras que tienen una potencia de dos limitaciones deben usar 16 porque es la potencia más pequeña de dos que es al menos 10.
fuente
No excluya la posibilidad de que no haya una razón específica.
Podría ser que estas dos colecciones hayan sido escritas por diferentes equipos. Ambos eligieron un número pequeño como capacidad predeterminada, pero el primer equipo pensó decimadamente y eligió 10, mientras que el segundo equipo pensó binario y eligió 16.
fuente
La respuesta de @ Esailija es buena para este caso específico.
Sin embargo, de manera más general, es una compensación que depende de muchos factores. Daré algunos ejemplos:
Como resultado de estas compensaciones, es bastante comprensible que diferentes implementaciones de recolección puedan tener una capacidad predeterminada óptima diferente.
fuente