Для эксперимента я сделал эту небольшую программу. Он просто генерирует 10 миллионов случайных строк и добавляет их в arraylist. Обратите внимание, что у arraylist не есть начальная емкость.
// editors note: added the necessary boilerplate to run,
// and take initial capacity as an optional cmdline arg for easier testing
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
class ArrayListTest {
public static void main(String[] args)
{
int initsize = -1;
if (args.length > 0) {
initsize = Integer.parseInt(args[0]);
}
long startTime = System.currentTimeMillis();
List<String> randNums = initsize>=0 ? new ArrayList<>(initsize) : new ArrayList<>();
// final List<String> randNums = initsize>=0 ? new ArrayList<String>(initsize) : new ArrayList<String>();
Random r = new Random(1);
for (int i = 0; i < 10_000_000; i++) {
final int randomNum = r.nextInt();
randNums.add(Integer.toString(randomNum));
}
System.out.println(System.currentTimeMillis() - startTime);
}
}
Я запускал его 5 раз, а результаты в ms:
8917
8720
7814
8768
8867
Затем я изменил программу, чтобы дать ArrayList начальную емкость:
List<String> randNums = new ArrayList<>(10_000_000);
Я снова запустил его 5 раз, и это были результаты:
11562
10454
10499
10481
10415
Это определенно последовательно становилось медленнее. Я предположил, что это было бы наоборот, поскольку, объявив достаточно большой начальный размер, я отобрал все накладные расходы ArrayList, увеличив свою собственную емкость. Почему это было медленнее?
Дополнительная информация: Jre 1.8.051, 64-bit (В окнах 10);