【问题标题】:Declaring a LinkedList in Java在 Java 中声明一个链表
【发布时间】:2012-04-08 07:26:51
【问题描述】:

当我们声明一个我们应该做的集合时,我总是学习Interface ob = new Class(),如果我想使用例如 LinkedList,我会做List ob = new LinkedList(),但是我无法访问 LinkedList 中的所有方法。 . 不是LinkedList ob = new LinkedList() 100% 正确吗?

【问题讨论】:

  • 取决于你想要达到的目标,看看这个:[检查你的答案][1]这里stackoverflow.com/questions/2451849/polymorphic-call
  • LinkedList ob = new LinkedList(),以这种方式创建对象只是你想使用 LinkedList 类,没有错。再次这取决于你想要从实现中得到什么。
  • 问得好,马西奥。刚才遇到一个情况,想使用addFirst(E e)addLast(E e),但是在List界面找不到。

标签: java list collections linked-list


【解决方案1】:

必须灵活地采用“始终编码到接口”的规则。您的建议很好,而且当您得出结论时,这是唯一的选择。

顺便说一句,像这样的具体类的编码对于大多数 JVM 来说更快。决定表演是否值得打破规则是很难决定的。

【讨论】:

  • 你有数据支持这个说法吗?这是我第一次听说对接口的编码可能比对具体类的编码要慢。
  • @krzyk - 自己测试并不难。当list 被声明为List<Integer> 时,对类似list.get() 的方法调用比在声明ArrayList<Integer> 时要慢得多(如果你做的足够多的话)。 (对于测试get(),我不会使用LinkedList。)在一个简单的测试中,我在Java 6 下运行,它只使用get() 访问每个数组元素,对于1,000 个元素,通用调用多花费了大约10% ,对于 10,000 个元素,增加约 18%。
  • developer.android.com/guide/practices/design/…。公平地说,这种说法是关于没有 JIT 的 JVM。
  • 这里有一篇关于它的 SO 帖子,stackoverflow.com/questions/6839943/…
【解决方案2】:

您仍然可以使用 List 访问 LinkedList 方法,您所要做的就是键入 cast 例如

((LinkedList)ob).add()

使用泛型 List 而不是 LinkedList 的意义在于,如果您只是更改正在使用的列表类型(比如说双链表),您的程序仍然可以工作泛型是为了简化您的代码,使其更具可移植性和更多“多变”

【讨论】:

    【解决方案3】:

    我不会总是建议你使用泛型...... 因为有时您可能需要像这里一样包装不同的对象....

              String str="a string";
              boolean status=false;
    
              LinkedList ll = new LinkedList();
              ll.add(str);
              ll.add(status);
    

    在某些情况下,例如 RMI,您只能发送序列化数据.....假设您要发送一个类对象(未序列化).......在那里您可以包装LinkedList 中的类(基元)并将该对象作为一个整体传递......不用担心大量的参数...... 考虑例如:

           public Class DataHouse
           {
                 public int a;
                 public String str;
                 .
                 .
                 .
           }
    

    现在你需要在某个地方传递对象.... 您可以执行以下操作....

                 DataHouse dh =new DataHouse();
                 LinkedList ll = new LinkedList();
                 ll.add(dh.a);
                 ll.add(dh.str);
    
                 // Now the content is serialized and can pass it as a capsuled data......
    

    【讨论】:

      【解决方案4】:

      不..这是错误的,在后期如果他想将他的实现从链表更改为列表类型的任何其他实现,他会出错......所以最好使用接口级别的声明。

      【讨论】:

        【解决方案5】:

        实际上,如果将其参数化会更好,因为两者都是原始类型。

        【讨论】:

          【解决方案6】:

          您应该始终尝试将声明保持在最高级别可能,这意味着您应该停止在提供您需要的所有功能的最高级别:如果List 方法还不够,您的LinkedList 声明完全没问题。

          【讨论】:

            【解决方案7】:

            LinkedList 是一个泛型。你应该这样做:

            LinkedList<String> linkedList = new LinkedList<String>();
            

            (或者你需要在其中存储的任何其他内容,而不是字符串)

            【讨论】:

              【解决方案8】:

              如果你真的需要使用 List 接口上没有的方法,那么使用 LinkedList 的 API 肯定没有错。对 List 接口进行编程的一般规则认识到 1) 很少需要这些方法,以及 2) 在大多数人的经验中,我发现我需要对列表进行排序和/或使用大量随机数的可能性更大访问,并决定切换到 ArrayList,而不是我需要 LinkedList 才有的方法之一。

              如果您发现 List 没有为您提供所需的内容,也可能是您正在对 Queue 接口进行编程。

              【讨论】:

                【解决方案9】:

                并非完全 100% 正确。

                声明任何集合的首选方法是包含它所持有的数据类型。所以,对于你的例子,它是LinkedList&lt;Integer&gt; ob = new LinkedList&lt;Integer&gt;();

                【讨论】:

                  【解决方案10】:

                  是的,

                  LinkedList<...> items = new LinkedList<...>();
                  

                  如果您知道items 将依赖于LinkedList&lt;T&gt; 的方法,而这些方法未在List&lt;T&gt; 接口中捕获,那么这是完全正确的。

                  【讨论】:

                    【解决方案11】:

                    LinkedList ob = new LinkedList() 不是 100% 正确吗?

                    我建议使用通用形式,但可以肯定的是 - 如果您想使用 特定LinkedList 的功能,您需要相应地声明变量。

                    您可能需要检查Deque&lt;E&gt;Queue&lt;E&gt; 接口是否具有您想要的功能。如果他们这样做,请使用与描述您需要什么而不是您将使用什么实现的想法保持一致的那些。

                    【讨论】:

                    • 实际上没有任何方法特定LinkedList;一切要么覆盖超类方法(如clone()),要么实现其接口之一的方法。如果您想使用Deque(例如peek())指定的方法以及List(例如indexOf())指定的方法,但两者都没有指定,那么除了声明变量之外别无他法成为LinkedList
                    猜你喜欢
                    • 2020-10-10
                    • 2011-02-11
                    • 2013-06-01
                    • 2023-03-28
                    • 2012-04-08
                    • 2020-02-09
                    • 2020-06-14
                    • 1970-01-01
                    相关资源
                    最近更新 更多