Хотя ответы, предлагающие использовать ArrayList, имеют смысл в большинстве сценариев, на настоящий вопрос об относительной производительности ответа пока нет.
Есть несколько вещей, которые вы можете сделать с массивом:
- создать его
- установить предмет
- получить предмет
- клонировать / скопировать
Общий вывод
Хотя операции получения и установки на ArrayList выполняются несколько медленнее (соответственно, 1 и 3 наносекунды на вызов на моей машине), очень мало затрат на использование ArrayList по сравнению с массивом для любого не интенсивного использования. Однако следует помнить несколько вещей:
- операции по изменению размера списка (при вызове
list.add(...)
) являются дорогостоящими, и при возможности следует попытаться установить начальную емкость на адекватном уровне (обратите внимание, что такая же проблема возникает при использовании массива)
- при работе с примитивами массивы могут быть значительно быстрее, поскольку они позволяют избежать многих преобразований в бокс / распаковку
- приложение, которое получает / устанавливает значения только в ArrayList (не очень часто!), Может получить прирост производительности более чем на 25% при переключении на массив
Подробные результаты
Вот результаты, которые я измерил для этих трех операций, используя jmh библиотеку бенчмаркинга (раз в наносекундах) с JDK 7 на стандартном настольном компьютере x86. Обратите внимание, что ArrayList никогда не изменяется в тестах, чтобы убедиться, что результаты сопоставимы. Код эталонного теста доступен здесь .
Создание массива / ArrayList
Я выполнил 4 теста, выполнив следующие инструкции:
- 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);
Результаты (в наносекундах на звонок, 95% достоверность):
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]
Вывод: заметной разницы нет .
получить операции
Я выполнил 2 теста, выполнив следующие инструкции:
- getList:
return list.get(0);
- getArray:
return array[0];
Результаты (в наносекундах на звонок, 95% достоверность):
a.p.g.a.ArrayVsList.getArray [2.958, 2.984]
a.p.g.a.ArrayVsList.getList [3.841, 3.874]
Вывод: получение из массива примерно на 25% быстрее , чем из ArrayList, хотя разница составляет всего лишь одну наносекунду.
операции над множествами
Я выполнил 2 теста, выполнив следующие инструкции:
- setList:
list.set(0, value);
- setArray:
array[0] = value;
Результаты (в наносекундах за звонок):
a.p.g.a.ArrayVsList.setArray [4.201, 4.236]
a.p.g.a.ArrayVsList.setList [6.783, 6.877]
Вывод: операции над множествами над массивами примерно на 40% быстрее , чем над списками, но, как и при получении, каждая операция над множеством занимает несколько наносекунд - поэтому, чтобы разница достигла 1 секунды, потребуется устанавливать элементы в списке / массиве сотни миллионов раз!
Клон / копия
Конструктор копирования ArrayList делегирует Arrays.copyOf
, поэтому производительность идентична копии массива (копирование массива с помощью clone
, Arrays.copyOf
или System.arrayCopy
не оказывает существенного влияния на производительность ). 1111 *