Java数据结构(简单问题)

时间:2010-11-06 19:46:34

标签: java generics data-structures

说我想在java中使用链表。我认为创建一个的最好方法是:

列表list = new LinkedList();

但我注意到这种方式我只能在列表中使用通用的方法。我假设不同数据结构的实现是不同的。

因此,如果我想使用链接列表的特定方法,我必须通过以下方式创建列表:

LinkedList list = new LinkedList();

主要原因是什么?

Tnanks。

4 个答案:

答案 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