【问题标题】:General use of Linked List链表的一般用途
【发布时间】:2021-08-18 12:22:42
【问题描述】:

我知道您可以创建自己的 Linked List 类或使用 java.util 导入一个。 像这样:

import java.util.*;  

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

然后使用已经存在的方法对列表进行一些操作,例如添加、获取、设置... 但您也可以创建自己喜欢的链接列表:

class LinkedList {
Node head; // head of list


class Node {
    int data;
    Node next;

    Node(int d) { data = d; }
}
}

但是,如果您这样做,则需要创建所有方法。 我的问题很简单,我应该使用方法 1 还是 2 ?如果两者都很好,什么时候使用一个比另一个更好。

【问题讨论】:

  • 老实说,除非您知道为什么要专门使用LinkedList,否则通常最好只使用ArrayList。另外,您为什么要首先创建自己的 LinkedList 实现?
  • 除非你想自己写,否则最好使用已经实现的。
  • 您应该使用现有的标准LinkedList,因为它已经被成千上万的程序员测试和使用了数百万次并且运行良好。只有在特别需要的情况下,您才应该自己编写,例如学校作业。
  • @Nexevis 学习如何编写链表实现。
  • @Dave Newton 那么他不会问他是否应该只使用LinkedList 而不是自己写,如果那是他的预期目的?

标签: java linked-list


【解决方案1】:

如果您需要通用的List,请使用java.util.LinkedList。它是一个标准的类,成熟、经过充分测试、几乎所有 Java 开发人员都能很好地理解……而且,它很简洁,因为您不必实现它。

实际上,不要使用它:使用java.util.ArrayListjava.util.ArrayDeque,它们几乎在所有情况下都优于LinkedList。见When to use LinkedList over ArrayList in Java?

如果您真的需要更专业的东西,请实施您自己的,但前提是您真的,真的需要它。

只有在你真正需要的时候才让你的类实现java.util.List

避免在接口中实现“一切”的一个很好的起点是扩展java.util.AbstractList:这只需要您提供get(int)size()的实现,并且,如果您希望列表为可修改,set(int, E)(您可能希望覆盖其他人以获得更好的链表性能)。

【讨论】:

    【解决方案2】:

    除非您需要现有轮子无法提供的极其具体的东西,否则不要重新发明轮子。

    另外,可能值得一提的是,链表的性能特征很差,因为它们占用的内存不是连续的,导致从主内存进行多次读取 (link)。

    【讨论】:

    • 这是一篇很有见地的文章。正如作者解释的那样,我将不得不检查自己在 java 中是否属实。谢谢你分享这个。
    猜你喜欢
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2011-04-16
    • 2017-04-05
    相关资源
    最近更新 更多