Embora as respostas que propõem usar o ArrayList façam sentido na maioria dos cenários, a questão real do desempenho relativo ainda não foi realmente respondida.
Existem algumas coisas que você pode fazer com uma matriz:
- crie
- definir um item
- obter um item
- clonar / copiar
Conclusão geral
Embora as operações get e set sejam um pouco mais lentas em um ArrayList (resp. 1 e 3 nanossegundos por chamada em minha máquina), há muito pouco uso de um ArrayList vs. um array para qualquer uso não intensivo. No entanto, há algumas coisas a serem lembradas:
- operações de redimensionamento em uma lista (ao chamar
list.add(...)
) são caras e deve-se tentar definir a capacidade inicial em um nível adequado sempre que possível (observe que o mesmo problema ocorre ao usar uma matriz)
- ao lidar com primitivas, as matrizes podem ser significativamente mais rápidas, pois permitem evitar muitas conversões de boxe / unboxing
- um aplicativo que apenas obtém / define valores em um ArrayList (não muito comum!) pode ver um ganho de desempenho superior a 25% ao alternar para um array
Resultados detalhados
Aqui estão os resultados que eu medi para essas três operações usando a biblioteca de benchmarking jmh (tempos em nanossegundos) com o JDK 7 em uma máquina desktop x86 padrão. Observe que o ArrayList nunca é redimensionado nos testes para garantir que os resultados sejam comparáveis. Código de referência disponível aqui .
Criação de array / ArrayList
Eu executei 4 testes, executando as seguintes instruções:
- createArray1:
Integer[] array = new Integer[1];
- createList1:
List<Integer> list = new ArrayList<> (1);
- createArray10000:
Integer[] array = new Integer[10000];
- createList10000:
List<Integer> list = new ArrayList<> (10000);
Resultados (em nanossegundos por chamada, 95% de confiança):
a.p.g.a.ArrayVsList.CreateArray1 [10.933, 11.097]
a.p.g.a.ArrayVsList.CreateList1 [10.799, 11.046]
a.p.g.a.ArrayVsList.CreateArray10000 [394.899, 404.034]
a.p.g.a.ArrayVsList.CreateList10000 [396.706, 401.266]
Conclusão: nenhuma diferença perceptível .
obter operações
Eu executei 2 testes, executando as seguintes instruções:
- getList:
return list.get(0);
- getArray:
return array[0];
Resultados (em nanossegundos por chamada, 95% de confiança):
a.p.g.a.ArrayVsList.getArray [2.958, 2.984]
a.p.g.a.ArrayVsList.getList [3.841, 3.874]
Conclusão: obter de um array é cerca de 25% mais rápido que obter um ArrayList, embora a diferença seja apenas da ordem de um nanossegundo.
definir operações
Eu executei 2 testes, executando as seguintes instruções:
- setList:
list.set(0, value);
- setArray:
array[0] = value;
Resultados (em nanossegundos por chamada):
a.p.g.a.ArrayVsList.setArray [4.201, 4.236]
a.p.g.a.ArrayVsList.setList [6.783, 6.877]
Conclusão: as operações de configuração em matrizes são cerca de 40% mais rápidas que nas listas, mas, quanto ao get, cada operação de configuração leva alguns nanossegundos - portanto, para que a diferença atinja 1 segundo, seria necessário definir itens na lista / matriz centenas de milhões de vezes!
clonar / copiar
Delegados cópia do construtor de ArrayList para Arrays.copyOf
isso o desempenho é idêntica à matriz cópia (cópia de uma matriz por meio de clone
, Arrays.copyOf
ou System.arrayCopy
não faz qualquer diferença significativa em termos de performance ).