Если при вставке новых элементов в ArrayList, недостаточно места, то новая ёмкость рассчитывается по формуле: (oldCapacity*3)/2+1 С какой целью разработчики так усложнили расчет на ёмкости? Нельзя было сделать, чтобы новая ёмкость добавлялась по одному? Спасибо.
Внутри ArrayList, как показывает его название, лежит обычный массив, так как Java не может гарантировать, что после массива есть свободная память, она увеличивает емкость ArrayList'а следующим образом:
Как вы понимаете, это все достаточно медленные действия и если выполнять при каждом добавлении элемента производительность будет плохой. С другой стороны, увеличивать емкость слишком сильно приведет к перерасходу памяти.
Поэтому экспериментально подобрали именно такую формулу. Так же эта формула удобна из-за простоты целочисленного деления на 2. Если посмотреть текущую реализацию ArrayList, то там формула:
int newCapacity = oldCapacity + (oldCapacity >> 1);
Что очень быстро, так как это просто побайтовый сдвиг и сложение.
Коэффициент получили опытным путем. Если добавлять по одному то замедлится скорость добавления новых элементов - так как на каждую вставку надо будет новый массив делать и копировать туда элементы. (Потому что после вашего массива в оперативной памяти могут идти другие данные) Очень рекомендую сделать свою версию с добавлением только на 1 элемент и замерить скорость работы на больших массивах данных.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости