据我所知,链表的概念是一堆通过“下一个”,有时是“前一个”属性来遍历对象而相互连接的对象。
我注意到在Java中,您可以创建一个LinkedList对象...但是使用相同的方法(如.add(),. get()等将其视为数组/列表/序列。
那么,LinkedList内部是一个类似数组的序列吗?
答案 0 :(得分:13)
那么,LinkedList内部是一个类似数组的序列吗?
没有。它是私有嵌套类Entry
的一系列实例,具有next
,previous
和element
引用。请注意,您可以通过查看JDK附带的源代码自己找到它。
这种内部结构未暴露的原因是它可以防止结构被破坏,例如包含一个循环。通过List
和Deque
接口的统一访问允许多态使用。
答案 1 :(得分:4)
LinkedList是一个实体链,每个实体都知道下一个实体, 因此get(index)操作需要使用counter来遍历此链。 但是这个列表针对按位置添加和删除进行了优化(如果我需要将元素放在列表中或从中间链表中删除元素表现更好)
答案 2 :(得分:4)
Java中的LinkedList就像您期望的那样工作。如果你使用正式的集合LinkedList那么它确实是一个一堆对象,它们通过一个' next'有时'以前' 。
是的,它有一个get(int index)
方法,这是令人惊讶的,因为它不会非常有效,因为你需要从头开始并在列表中向上计数以找到index
th这不是LinkedLists所擅长的。之所以存在,是因为LinkedList实现了List接口。这是所有列表都可以使用的。
但是,您可能会尝试避免使用LinkedList,因为大部分访问权限都是通过get(int index)
方法,因为这显然效率最低。您最好使用ArrayList。
答案 3 :(得分:2)
因为我知道链接列表就像你在第一段中所说的那样。每个对象有两个引用,称为前一个,下一个。 不像顺序工作的数组(在C中它完全按顺序存储。我认为java只是做同样的事情,这就是为什么我们不能重新调整数组大小),列表通过引用工作。所以逻辑上它比数组的工作速度慢。
答案 4 :(得分:1)
可以使用链表实现一个像数组一样工作的对象。与数组相比,某些操作会更快,而某些操作会更慢。例如,对于链接列表而不是数组,使用接近结尾的元素调用get()
可能要慢得多。但是,它仍然有可能。
另一方面,从链表中间删除元素将比使用数组完成的相应操作更快。
答案 5 :(得分:1)
不是真的。链接列表由集合提供,通过良好的设计,您可以创建双链表。现在它不像数组,因为这些对象不会有索引,也不是容器中的元素,即列表。因此,您将通过定义下一个和上一个并指示下一步行动。他们都有相同的方法,因为他们再次像我说的那样收藏。
答案 6 :(得分:0)
那么,LinkedList内部是一个类似数组的序列吗?
否这是双重链接列表实现。
答案 7 :(得分:-8)
在内部它将使用所谓的'slab allocator' - 这基本上是一个小数组的链表。每次添加对象时,它都会检查平板中是否有空格,如果是,则将对象放在那里。否则,它会分配一个新的slab并将该对象放在slab的第一个元素中。
这种技术可以最大限度地减少内存分配开销 - 如果你将大量项目添加到链表中,那将是大量的小内存分配,需要花费很多时间,并且slab分配器会最小化