tgoop.com/javaproglib/7093
Create:
Last Update:
Last Update:
Многие недооценивают, насколько ArrayList может быть узким местом в производительности, особенно при работе с большими объёмами данных. Разберём, как оптимизировать его использование 👇
⚙️ Указывайте ёмкость при создании
По умолчанию:
List<String> list = new ArrayList<>();
ArrayList начинает с небольшой ёмкости (10 элементов) и каждый раз увеличивается в 1.5 раза, когда не хватает места. Это вызывает множество копирований массива, что замедляет работу при миллионах элементов.
List<String> list = new ArrayList<>(1_000_000);
Если вы знаете (или можете оценить) количество элементов заранее — выделите память сразу. Это уменьшает количество realocations и экономит до 30–40% времени при массовых вставках.
🧠 Очищайте, а не пересоздавайте
Многие делают так:
list = new ArrayList<>();
Это создаёт новый объект и выбрасывает старый в GC. При частых операциях — GC начинает тормозить систему.
list.clear();
Если список используется повторно, очистка быстрее и не требует новой аллокации памяти.
⚡️ Не используйте remove() в цикле
Удаление элементов в цикле вручную — частая и дорогая ошибка.
Плохо:
for (String s : list) {
if (s.startsWith("A")) list.remove(s);
}
❌ Такой код приведёт к ConcurrentModificationException.
Даже если использовать Iterator, это безопасно, но медленно — каждый вызов remove() сдвигает все последующие элементы (O(n) на удаление).
list.removeIf(s -> s.startsWith("A"));
Метод removeIf оптимизирован под внутренние операции и работает быстрее при массовом удалении.
* Кстати, у нас есть курс по Алгоритмам и структурам данных со скидкой.
Ставь → 🔥, если интересно почитать про внутреннюю реализацию стандартных методов коллекций.
#CoreJava