说我想在java中使用链表。我认为创建一个的最好方法是:
列表list = new LinkedList();
但我注意到这种方式我只能在列表中使用通用的方法。我假设不同数据结构的实现是不同的。
因此,如果我想使用链接列表的特定方法,我必须通过以下方式创建列表:
LinkedList list = new LinkedList();
主要原因是什么?
Tnanks。
答案 0 :(得分:4)
List
是一个抽象基础列表实现的接口。它也可以通过例如ArrayList
。
但是,如果您特别想要LinkedList
,那么撰写LinkedList list
并没有错。事实上,如果您只是将其作为列表传递,人们可能(不知道实现)在不知不觉中编写如下算法:
for(int i = 0; i < list.size(); i++)
{
// list.get(i) or list.set(i, obj)
}
在随机访问列表(例如ArrayList
)上是线性的,但在LinkedList
上是二次的(最好使用迭代器或列表迭代器)。 Java提供RandomAccess标记接口,以便您区分。
当然,您也可以在LinkedList
类型的引用上调用这些方法,但是人们应该更有可能考虑成本。
请注意,在.NET中LinkedList
因此原因未实现IList
。
答案 1 :(得分:1)
第一个习语允许您更改列表指向的运行时类型,而无需修改使用它的任何客户端代码。
您认为您需要哪些LinkedList中的方法不在List中?你总是可以为那些人投。
但是接口背后的整个想法是保护客户端不受接口实现的影响。
如果你真的需要一个LinkedList,那就这样吧。但我更喜欢第一个成语,因为大多数时候我真的只需要List方法。
答案 2 :(得分:1)
每个LinkedList也是一个List。这也意味着您可以使用可以对List执行的LinkedList执行所有操作,并且可以将LinkedList存储为List。但是,当您将其存储为List时,您只能调用List也具有的LinkedList方法。
顺便说一下:这不是泛型。泛型是这样的:
LinkedList<String> list = new LinkedList<String>();
答案 3 :(得分:1)
List list = getSomeList();
这里你说这是一个清单。你不知道它是LinkedList
还是ArrayList
还是其他什么。这是一个抽象的东西(我假设你用“泛型”这个词来表示“抽象”,因为generics完全是另一回事)。因此,你不能把它视为LinkedList
- 你必须把它当作List
(就是它)。
“你知道”它是LinkedList
的事实一切都很好,如果你需要这样做,你可以安全地施展。但是通过声明它是LinkedList
可能有助于告诉编译器,如果它总是充当LinkedList
。