【问题标题】:Java data structures (simple question)Java 数据结构(简单问题)
【发布时间】:2010-11-06 19:46:34
【问题描述】:
假设我想在 java 中使用链表。我认为创建一个的最佳方法是:
列表列表 = new LinkedList();
但我注意到这样我只能使用列表中通用的方法。我假设不同数据结构之间的实现是不同的。
所以如果我想使用链表的具体方法,我必须通过以下方式创建链表:
LinkedList list = new LinkedList();
主要原因是什么?
坦克。
【问题讨论】:
标签:
java
generics
data-structures
【解决方案1】:
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。
【解决方案2】:
第一个习惯用法允许您更改 list 指向的运行时类型,而无需修改任何使用它的客户端代码。
你认为你需要哪些 LinkedList 中没有 List 的方法?你总是可以为那些演员。
但是接口背后的整个想法是屏蔽客户端如何实现接口。
如果您真的需要 LinkedList,那就这样吧。但我更喜欢第一个成语,因为大多数时候我真的只需要 List 方法。
【解决方案3】:
每个 LinkedList 也是一个 List。这也意味着您可以使用 LinkedList 执行所有可以使用 List 执行的操作,并且您可以将 LinkedList 存储为 List。但是,当您将其存储为 List 时,您只能调用 List 也具有的 LinkedList 的方法。
顺便说一句:这不是泛型。泛型是这样的:
LinkedList<String> list = new LinkedList<String>();
【解决方案4】:
List list = getSomeList();
这里你说它是一个列表。您不知道它是 LinkedList 还是 ArrayList 或其他。这是一个抽象的东西(我假设你的意思是“通用”这个词的“抽象”,因为generics 是完全不同的东西)。因此,您不能像对待 LinkedList 一样对待它——您必须像对待 List 一样对待它(确实如此)。
“你知道”它是LinkedList 的事实很好,如果需要,你可以安全地施放。但它可能有助于告诉编译器它是一个LinkedList,通过这样声明它,如果它总是充当LinkedList。