hlegius:
Huum !
Foi o que eu imaginei mesmo !
Depois que ele preenche os 10 itens, ele aumenta de forma aleatória o vetor oO
Fiz o teste:
- Iniciou com 10 indices
- Acabando-se os espaços e chamando o add() novamente, ele criou mais 6 indices
- Acabando esses novos 6 e chamando o add() novamente, ele criou mais 9 indices
- Acabando esses novos 9 e chamando o add() novamente, ele criou mais 13 indices
- Acabando esses novos 13 e chamando o add() novamente, ele criou mais 20 indices.
- Acabando esses novos 20 e chamando o add() novamente, ele criou mais 30 indices.
Engraçado que aparentemente não há uma regra de calculo para incremento. Interessante o funcionamento :)
Como o código é aberto, você é livre para ver como a implementacao funciona.
O método add, do Array list é mostrado abaixo:
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
Dá pra ver que o método ensureCapacity é responsável por assegurar que o array vai suportar o novo elemento.
Dando uma olhada no método ensureCapacity:
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
Ou seja, a nova capacidade é 3/2 mais 1 da anterior. Default é 10, então temos:
- Iniciou com 10 indices
- Acabando-se os espaços e chamando o add() novamente, ele criou mais 6 indices (16 = 10*(3/2) + 1)
- Acabando esses novos 6 e chamando o add() novamente, ele criou mais 9 indices (25 = 16*(3/2) + 1)
- Acabando esses novos 9 e chamando o add() novamente, ele criou mais 13 indices …
- Acabando esses novos 13 e chamando o add() novamente, ele criou mais 20 indices. …
- Acabando esses novos 20 e chamando o add() novamente, ele criou mais 30 indices. …