читал на просторах интернета об основных характеристиках ArrayList. И встретил такой текст:
" При записи в позицию capacity +1 происходит динамическое увеличение размера, а именно создается новый массив кол-во элементов в котором равно (capacity * 3) / 2 + 1 (capacity - вместимость) и в него перемещаются все элементы из старого + плюс добавляется новый элемент. В связи с этим свойством вставка в конец происходит в среднем за постоянное время. В среднем т.к периодически происходят операции расширения, которые занимают больше времени, чем вставка в пустую ячейку."
Я не понял описание этой характеристики "Динамическое увеличивает размер по формуле (capacity * 3) / 2 + 1" подскажите пожалуйста как можно подробнее узнать об этой характеристике, что бы понять эту характеристику списка, и в каких практических случаях учитывать ее?
Андрей Ольховой
15 уровень
Объясните пожалуйста динамическое увеличение размера ArrayList?
Решен
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ksenia Volkova Java Developer в DXC Master
2 июня 2020, 08:09полезный
Практически это можно учитывать вот как.
У ArrayList начальная вместимость по умолчанию - 10 (в классе ArrayList есть константа DEFAULT_CAPACITY, равная 10). То есть если ты создаешь список без указания capacity в конструкторе, то массив в нем будет создан именно на 10 ячеек.
Затем, если ты будешь добавлять элементы и их станет 10, то будет создан новый массив на 10 * 1.5 +1 = 16 ячеек, и данные из старого массива будут скопированы в новый. Потом при увеличении списка снова будет создаваться массив (на 25, 38, 58...), и данные в него будут копироваться из старого.
Так вот, если ты заранее знаешь, что тебе надо будет добавить в список много элементов, то может иметь смысл сразу указать нужное значение capacity при создании списка. Тогда не нужно будет многократно создавать новые массивы и копировать в них даные. (При этом все равно имеет смысл ориентироваться именно на минимально необходимое значение, чтобы не резервировать лишнюю память. ArrayList все равно потом увеличит размер, если в этом будет необходимость).
+2
Justinian Judge в Mega City One Master
2 июня 2020, 07:21полезный
грубо говоря, представь ArrayList вот так:
Сама суть понятна?
Есть у нас класс, под капотом у него массив.
Массив как мы знаем, не может расширяться или сужаться, если он уже создан с определенным размером, то таким и умрет.
Это неудобно.
Поэтому придумали такую конструкцию - авторасширение. То есть создается с определенным запасом массив. И мы туда бросаем элементы.
Когда место заканчивается (по разному бывает, может стоять и 75% загрузка), создается НОВЫЙ массив, с размерностью:
(в твоей формуле 1.5 это 3 / 2)
в него перекопируется старый массив и теперь у нас увеличенный в полтора раза массив.
Таким образом мы можем писать просто:
list.add(2);
и не переживать, а заполнен там массив или нет.
Под капотом ArrayList, когда нужно будет автоматически происходит увеличение массива.
+5
Justinian Judge в Mega City One Master
2 июня 2020, 07:41полезный
Тебе на данный момент нужно знать две вещи:
1. Как внутри устроен ArrayList, что это структура данных, которая имеет в своей основе обычный массив.
2. Что при достижении определенных крайних значений заполненности, будет происходить автоматическое расширение массива, чтобы можно было добавлять следующие элементы.
Структуры данных в картинках. ArrayList
И вывод на экран:
можешь поверить на слово, а можешь (так лучше) скопировать код себе, и попробуй позапускать, добавить 1 элемент, или 20, можешь отдебажить или сделать геттер для массива внутреннего и проверить его размер.
Хорошая статья на тему:
+3
Sergei Kirianov
12 октября 2022, 18:37
Не мог бы ты объяснить что происходит в toString, который переписан.
0
Justinian Judge в Mega City One Master
27 октября 2022, 15:11
Привет, каждый объект в джаве это набор аттрибутов, их значений, единичек и ноликов.
Но часто есть потребность, визуально работать с объектом, поэтому в классе Object есть метод toString() , этот метод есть во всех классах в джаве (поскольку классы наследуются от Object и имеют его методы)
Метод toString возвращает представление объекта в текстовом виде.
Программисты сами определяют как это выглядит, переопределяя этот метод ПРИ НЕОБХОДИМОСТИ.
Посмотри материалы ниже:
- https://comaqa.gitbook.io/java-automation/oop-v-java/metod-tostring
- https://www.internet-technologies.ru/articles/ispolzovanie-metoda-tostring-v-java.html
- https://www.youtube.com/watch?v=KEQ043yT3F4
После того почитаешь, вернемся к примеру выше:
здесь мы переопределяем метод туСтринг, сигнатура метода должна быть именно такой, тогда.
инициализируем пустую строку, к которой будем добавлять
0
Justinian Judge в Mega City One Master
27 октября 2022, 15:11
0