Почему LinkedList не имеет initialCapacity в java?
Интересно, почему LinkedList
не имеет initialCapacity
.
Я знаю, когда использовать ArrayList
и LinkedList
.
Хорошая практика определения окончательного размера коллекции, например:
List<String> arraylist = new ArrayList<String>(5);
Для LinkedList
например:
List<String> linkedlist = new LinkedList<String>(); // right way
но
List<String> arraylist = new LinkedList<String>(5); // compilation error
Может кто-нибудь распространить свет на этот вопрос?
[EDIT]
Кстати, я могу написать
List<String> arraylist = new ArrayList<String>(5);
List<String> linkedlist = new LinkedList<String>(arraylist);
Ответы
Ответ 1
LinkedList по своей природе не имеет "емкости", поскольку он не выделяет память элементам до того, как элементы будут добавлены в список. Каждый элемент в LinkedList содержит указатель на следующий в списке.
![http://www.stoimen.com/blog/wp-content/uploads/2012/06/0.-Arrays-vs.-linked-list.png]()
Не было бы необходимости заранее выделять память в список, так как LinkedList не имеет емкости.
Ответ 2
Его модель не основана на массиве, а скорее на истинном связанном списке, и поэтому нет никакой необходимости, и в дальнейшем это не имеет смысла. Не имеет смысла иметь пустые ссылки, например, у вас есть пустые элементы массива.
Ответ 3
Почему LinkedList
имеет начальную емкость?
ArrayList
подкрепляется массивом, поэтому начальная емкость - это начальный размер массива. LinkedList
не нуждается в этом.
Ответ 4
Зачем вам нужна емкость LinkedList? LinkedList не работает с массивами с фиксированным размером. Каждый LinkedListElement имеет указатель (ссылку!) На следующий элемент в списке. Который из-за этого можно добавить элемент в связанный список в постоянное время. Но дорого стоить случайный доступ к элементам в Списке. Вам нужно пройти через все Элементы в списке, пока не достигнете цели.
Ответ 5
Linkedlist не требует начального значения. Это основное отличие между массивом и связанным списком.
Массив закончится где-нибудь. Но связанного списка нет. Связанный список не работает с граничными значениями.
Ответ 6
Когда вы объявляете массив, вы должны знать его размер, потому что указатели должны быть созданы в памяти. Связанный список не нуждается в этом, потому что нет необходимости в указателях на память, прежде чем какой-либо объект будет добавлен в список.
Связанный список определяется рекурсивно как:
пустой список
en, который указывает на пустой список
поэтому всякий раз, когда вы добавляете элемент, вы выделяете память (или, скорее, в Java, компилятор делает это) при создании элемента, а затем, когда вы добавляете его в список, теперь он указывает на список (или последний элемент в список указывает на это).
Поэтому вам не нужно объявлять начальный размер связанного списка, потому что связанный список всегда начинается с пустого списка, а когда добавляется элемент, он указывает на список.