2012-05-29 8 views
31

vi el doc java para ArrayList y encontraron que la capacidad inicial de ArrayList es 10.¿Por qué es la capacidad predeterminada de ArrayList 10?

/** 
* Constructs an empty list with an initial capacity of ten. 
*/ 
public ArrayList() { 
this(10); 
} 

Creo que tendría sentido si se tratara de cualquier potencia de 2, pero ¿por qué 10?

También verifiqué la capacidad inicial de HashMap, y es 16 lo que tiene sentido.

/** 
* The default initial capacity - MUST be a power of two. 
*/ 
static final int DEFAULT_INITIAL_CAPACITY = 16; 

/** 
* Constructs an empty <tt>HashMap</tt> with the default initial capacity 
* (16) and the default load factor (0.75). 
*/ 
public HashMap() { 
    this.loadFactor = DEFAULT_LOAD_FACTOR; 
    threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR); 
    table = new Entry[DEFAULT_INITIAL_CAPACITY]; 
    init(); 
} 

¿Hay alguna razón específica detrás del número 10?

+15

>>> puede hacer SENCE si sería cualquier cantidad de poder de 2_ ¿por qué? –

+4

Creo que vuelve a la forma de vida dominante en cs que parecen tener dos manipuladores con 5 dígitos en cada uno.Esos fueron utilizados para contar en los primeros días de la informática. Por lo tanto, prefieren potencias de 10 para todo tipo de cosas. –

+4

10 es la capacidad inicial de la Lista de matrices, no el tamaño. El tamaño inicial siempre es 0. – BOSS

Respuesta

35

La ArrayList es una matriz de crecimiento simple. Cuando se intenta agregar un elemento, y se excede el tamaño del búfer, simplemente está creciendo. Entonces, el tamaño inicial puede ser cualquier valor positivo.

El 1 sería demasiado pequeño. Incluso con algunos elementos tendremos algunas operaciones de cambio de tamaño.

El 100 sería una pérdida de espacio.

Entonces, el 10 es un compromiso. ¿Por qué 10 y no 12 u 8? Primera pista, que los casos de uso típicos se analizaron y esta es la mejor opción entre pérdida de rendimiento y pérdida de espacio. Sin embargo, creo, al ver el código original de Sun, que no se analizó tan profundamente y es un número arbitrario "no demasiado pequeño".

1

10 es probablemente un número más o menos arbitrario para la cantidad predeterminada de elementos.

+1

No creo que los desarrolladores de sol estén lo suficientemente locos como para usar cualquier número aleatorio como número predeterminado sin pensarlo mucho. Deben haber pensado en algún escenario útil y eficiente. –

5

elección totalmente arbitraria.

Y no hay ninguna razón por la que el poder-de-2 tenga más sentido aquí. Tiene sentido en un HashMap, debido a cómo funciona el hash. De hecho, es tiene que ser una potencia de dos (según el comentario en la fuente).

Tenga en cuenta que java.util.Vector (que es el hermano mayor de ArrayList) también tiene 10.

+0

sí, también tiene. Y también puede haber una razón para la capacidad de ArrayList. Pero entonces la pregunta es, ¿por qué la capacidad inicial del vector es 10? –

13

para una lista, no hay ninguna ventaja en tener la capacidad de ser una potencia de dos. De hecho, no hay una ventaja real en ninguna capacidad de inicio específica. Tiene que ser lo suficientemente grande como para evitar pasos de cambio de tamaño múltiples para el caso común de listas pequeñas, y lo suficientemente pequeño como para no desperdiciar memoria en la capacidad no utilizada en ese mismo caso. 10 probablemente fue elegido simplemente porque se encuentra en el rango correcto para cumplir con estos requisitos y porque es "redondo".

+1

Puede que no haya una ventaja real para cualquier capacidad específica aunque sea de potencia de 2. Pero luego, si los desarrolladores de sol han hecho suficiente análisis de una gran cantidad de escenarios para encontrar cualquier número, al menos deberían compartirlo, puede ser no en el documento de Java, sino en cualquier blog oficial. Para que todos en la comunidad de opersource tengan una idea y otros programadores puedan expresar sus puntos de vista para hacer que este número de capacidad inicial sea más relevante para los casos de uso de desarrollo reales. –

+5

@Priyank Doshi: Es posible que esté pensando demasiado en esto ... – Thilo

+3

@Priyank Doshi: el capital inicial ideal será diferente entre aplicaciones, por lo que el promedio sobre una gran cantidad de escenarios en realidad no sería muy útil; el valor exacto es extremadamente improbable importar para la mayoría de las aplicaciones, pero para aquellas en las que sí importa, querrá usar el mejor valor para esa aplicación específica, no un promedio. –

0

A menos que haya un comentario en el código, nunca lo sabremos con certeza. Sin embargo, imagino que en algún momento un ingeniero de Sun ha reunido estadísticas sobre el uso de ArrayList en un gran número de aplicaciones del mundo real, y determinado ... empíricamente ... que 10 dieron aproximadamente los mejores resultados en promedio. (Así es como sintonizan cosas como esta, el optimizador, el diseño de bytecode, etc.)

Y, y otros señalaron, no hay ventaja computacional (o desventaja) en el uso de un tamaño que es una potencia de dos para el tamaño de ArrayList.

10

Vector, de JDK 1.0 tenía una capacidad inicial predeterminada de 10, por lo que probablemente tenía sentido mantener coherencia cuando introdujeron ArrayList en 1.2. _it

+0

No. Eso sería un cambio incompatible. El Javadoc, que es la especificación, dice que la capacidad predeterminada es 10, por lo que no pueden simplemente cambiarla. – Thilo

+3

@PriyankDoshi Lo que quiero decir es que probablemente desearon que ArrayList se mantuviera consistente con Vector, ya que están estrechamente relacionados. No se refiere a las otras implementaciones de colecciones. –

Cuestiones relacionadas