Dúvida com ArrayList e indices nulos

3 respostas
hlegius

Olá !
Sempre que estou debugando alguma coisa me deparo com uma coisa um tanto estranha nos ArrayList's.

Tenho lá:

public class Clazz {
    private ArrayList<String> criterios = new ArrayList<String>();

    // ....

    criterios.add("foobaz");
}

Na sessão de debugging ele me aparece conforme imagem anexada. (meu foobaz presente e um monte de indices nulos)

A única explicação que eu teria para isto é: ele cria uma certa quantidade de índices na sua inicialização.
Alguém tem alguma ideia ?

Abraços !

3 Respostas

Vini_Fernandes

Sempre que fazemos

List lista = new ArrayList();

instanciamos uma lista com capacidade inicial de 10 objetos.

T+

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:

  1. Iniciou com 10 indices
  2. Acabando-se os espaços e chamando o add() novamente, ele criou mais 6 indices
  3. Acabando esses novos 6 e chamando o add() novamente, ele criou mais 9 indices
  4. Acabando esses novos 9 e chamando o add() novamente, ele criou mais 13 indices
  5. Acabando esses novos 13 e chamando o add() novamente, ele criou mais 20 indices.
  6. 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 :slight_smile:

S

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:

  1. Iniciou com 10 indices
  2. Acabando-se os espaços e chamando o add() novamente, ele criou mais 6 indices
  3. Acabando esses novos 6 e chamando o add() novamente, ele criou mais 9 indices
  4. Acabando esses novos 9 e chamando o add() novamente, ele criou mais 13 indices
  5. Acabando esses novos 13 e chamando o add() novamente, ele criou mais 20 indices.
  6. 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:

  1. Iniciou com 10 indices
  2. Acabando-se os espaços e chamando o add() novamente, ele criou mais 6 indices (16 = 10*(3/2) + 1)
  3. Acabando esses novos 6 e chamando o add() novamente, ele criou mais 9 indices (25 = 16*(3/2) + 1)
  4. Acabando esses novos 9 e chamando o add() novamente, ele criou mais 13 indices …
  5. Acabando esses novos 13 e chamando o add() novamente, ele criou mais 20 indices. …
  6. Acabando esses novos 20 e chamando o add() novamente, ele criou mais 30 indices. …
Criado 7 de fevereiro de 2010
Ultima resposta 7 de fev. de 2010
Respostas 3
Participantes 3