【问题标题】: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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-12-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-19
            • 1970-01-01
            • 2011-03-19
            相关资源
            最近更新 更多