Хотя ответы, предлагающие использовать ArrayList, имеют смысл в большинстве сценариев, на настоящий вопрос об относительной производительности ответа пока нет.
Есть несколько вещей, которые вы можете сделать с массивом:
- создать это
- установить предмет
- получить предмет
- клонировать / скопировать
Общий вывод
Хотя операции получения и установки в ArrayList выполняются несколько медленнее (соответственно 1 и 3 наносекунды на вызов на моей машине), использование ArrayList и массива очень мало по сравнению с массивом для любого не интенсивного использования. Однако следует помнить несколько вещей:
- операции по изменению размера списка (при вызове
list.add(...)
) являются дорогостоящими, и по возможности следует попытаться установить начальную емкость на адекватном уровне (обратите внимание, что та же проблема возникает при использовании массива)
- при работе с примитивами массивы могут быть значительно быстрее, поскольку они позволяют избежать многих преобразований в бокс / распаковку
- приложение, которое получает / устанавливает значения только в ArrayList (не очень часто!), может получить прирост производительности более чем на 25%, переключившись на массив
Подробные результаты
Вот результаты, которые я измерил для этих трех операций, используя библиотеку сравнительного анализа jmh (время в наносекундах) с JDK 7 на стандартной настольной машине x86. Обратите внимание, что ArrayList никогда не изменяется в тестах, чтобы убедиться, что результаты сопоставимы. Код теста доступен здесь .
Array / 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 теста, выполнив следующие утверждения:
- Сет-лист:
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% быстрее, чем в списках, но, как и в случае с get, каждая операция над множеством занимает несколько наносекунд - поэтому для того, чтобы разница достигала 1 секунды, необходимо установить элементы в списке / массиве на сотни миллионов раз!
Клон / копия
Конструктор копирования Делегаты ArrayList, чтобы Arrays.copyOf
таким образом производительность является идентичной копией массива (копирование массива с помощью clone
, Arrays.copyOf
или System.arrayCopy
не имеет никакого существенного различия точки зрения производительности ).