我想知道为什么LinkedList
没有initialCapacity
。
我知道何时使用ArrayList
以及何时使用LinkedList
。
定义Collection最终大小的好习惯如:
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
有人可以就这个问题传播一下吗?
[编辑]
是的,我可以写List<String> arraylist = new ArrayList<String>(5);
List<String> linkedlist = new LinkedList<String>(arraylist);
答案 0 :(得分:33)
LinkedList本质上没有“容量”,因为它不会在项目添加到列表之前为项目分配内存。 LinkedList中的每个项目都包含指向列表中下一个的指针。
预先为列表分配内存没有意义,因为LinkedList没有容量。
答案 1 :(得分:8)
它的模型不是基于数组而是基于真正的链表,所以没有必要,而且它没有意义。拥有空链接就像没有空数组一样没有多大意义。
答案 2 :(得分:2)
为什么LinkedList
会有初始容量?
ArrayList
由数组备份,因此初始容量是数组的初始大小。 LinkedList
不需要这样做。
答案 3 :(得分:2)
为什么你需要LinkedList上的容量? LinkedList不适用于固定大小的数组。每个LinkedListElement都有一个指向列表中下一个Element的指针(链接!)。因此,可以在恒定时间内将元素添加到链表中。但随机访问List中的元素成本很高。您需要浏览列表中的所有元素,直到到达目的地。
答案 4 :(得分:1)
Linkedlist不需要初始值。这是数组和链表之间的主要区别。
数组将在某个地方结束。但是链表没有。链接列表不适用于边界值。
答案 5 :(得分:1)
当你声明一个数组时,你必须知道它的大小,因为需要在内存中创建指针。链表不需要这样,因为在将任何对象添加到列表之前不需要指向内存的指针。
链接列表以递归方式定义为: 一个空列表 zh_cn指向空列表的元素
因此,无论何时添加元素,都可以在创建元素时分配内存(或者更确切地说是Java编译器执行此操作),然后在将其添加到列表时,它现在指向列表(或者最后一个元素)列表指向它)。
因此,您不需要声明链接列表的初始大小,因为链接列表始终以空列表开头,并且添加元素时,它指向列表。
答案 6 :(得分:0)
ArrayList具有一个基础数组,该数组需要具有预定义的限制并且要不断更新。另一方面,由于没有底层数据结构,LinkedList只会增长/缩小。
答案 7 :(得分:0)
ArrayList 和 LinkedList 都有 List 接口的实现类。
ArrayList 使用 Resizable Array 或 Grow-able Array。在使用连续内存分配的数组数据结构中,我们可以通过索引访问数组的元素。当我们声明任何数组时,我们应该声明初始容量,因为找到用于存储数组元素的连续内存块。
LinkedList 在 Line 数据结构下使用双链表。在链表数据结构中,使用非连续内存分配并使用头尾概念来访问这些元素。所以在 LinkedList 中我们不需要任何初始容量。