Java集合(LinkedList概念)

Java集合(LinkedList概念),java,collections,linked-list,Java,Collections,Linked List,当我声明LinkedList时,我喜欢: List<String> names = new LinkedList<String>(); 然后它支持这些方法 是的,很明显,原因是引用,因为LinkedList包含该方法,而List没有 但我的问题是,当我想使用LinkedList时,哪一个更好、更正确?或者它们的用途是什么?如果您需要使用LinkedList中不存在的LinkedList方法,您应该使用LinkedList引用(您可以使用List引用并强制转换到Linke

当我声明
LinkedList
时,我喜欢:

List<String> names = new LinkedList<String>();
然后它支持这些方法

是的,很明显,原因是引用,因为
LinkedList
包含该方法,而
List
没有


但我的问题是,当我想使用
LinkedList
时,哪一个更好、更正确?或者它们的用途是什么?

如果您需要使用
LinkedList
中不存在的
LinkedList
方法,您应该使用
LinkedList
引用(您可以使用
List
引用并强制转换到
LinkedList
,以便调用
LinkedList
特定方法,但这没有什么意义).


否则,最好使用
列表
接口保存引用,因为它使代码更通用,因为它不依赖于任何特定的
列表
实现。

嗯,列表基本上由一个数组支持,该数组通常大于当前的项数。元素被放入一个数组中,当旧数组的空间不足时,将创建一个新数组。这对于通过索引进行访问很快,但是在列表中或开始时删除或插入元素很慢。在列表末尾添加/删除条目是相当便宜的

LinkedList是一个双链接列表-每个节点都知道其上一个条目和下一个条目。这对于在特定节点(或头部/尾部)之后/之前插入是快速的,但是在通过索引进行访问时是缓慢的

LinkedList通常会比List占用更多的内存,因为它需要为所有下一个/上一个引用留出空间,而且数据的引用位置可能会更少,因为每个节点都是一个单独的对象。另一方面,列表可以有一个比当前需要大得多的支持数组

参考自

您还可以参考oracle文档

Linked List
所有操作的执行都与双链接列表的预期一样。索引到列表中的操作将从开始或结束遍历列表,以更接近指定索引的为准

List

列表接口提供了四种对列表元素进行位置(索引)访问的方法。列表(如Java数组)是基于零的。请注意,对于某些实现(例如LinkedList类),这些操作的执行时间可能与索引值成比例。因此,如果调用者不知道实现,那么在列表中的元素上进行迭代通常比在列表中进行索引更可取。

关于这一点,有一个非常简单的解释,即
列表类似于数组,当它的空间用完时会生成新的数组。而
LinkedList
类似于双链接列表,其中每个节点都有上一个节点和下一个节点的链接

您可以从oracle文档中搜索更多信息


您可以根据自己的情况进行区分。:)

次要的挑剔:列表通常由数组支持,但由于
List
是一个接口,因此不能保证这一点。您可以创建一个使用树而不是数组来存储数据的实现类。见鬼,如果你真的想折磨自己,你可以把后台数据结构变成一个字符串,然后用一些可怕的反射代码+正则表达式来存储对象。如果您正在对接口编程,实现应该无关紧要。
List
不受数组的支持,它可以(如在ArrayList中)。但由于LinkedList也是一个列表(显然没有数组支持),所以“
List
就像一个正在生成新数组的数组…”这句话显然是错误的。列表基本上是由数组支持的,这就是为什么我这么说的原因。所以你可能会说,你不会是正确的。但列表基本上只由数组烘焙。不,列表只是一个接口,没有实现。它如何由阵列支持?让我看看实现!如果您从该列表实例创建arraylist。它是否由阵列支持?
List