ArrayList 和单链表一样吗?

Posted

技术标签:

【中文标题】ArrayList 和单链表一样吗?【英文标题】:Is an ArrayList the same thing as a singly-linked list? 【发布时间】:2012-11-30 20:35:16 【问题描述】:

在 Java 中,我被要求将整数值存储在单链表中,然后打印存储在列表中的元素。这是我想出的:

int max = 10;
List<Integer> list = new ArrayList<Integer>();

for (int num = 0; i < max; i++)
     list.add(num);

System.out.print(list);

我想知道,ArrayList 和单链表是一回事吗?我想确保我正确地回答了这个问题。这有意义吗?谢谢!

【问题讨论】:

【参考方案1】:

不,ArrayListList 接口的实现,它使用支持array 来存储数据。听起来任务要求您编写自己的 singly-linked List 实现。

【讨论】:

【参考方案2】:

No ArrayList 绝对与单链表相同。事实上,它根本不是一个链接列表:它是一个使用数组作为后备存储的列表。这允许您以任意顺序访问ArrayList,而不是必须按顺序访问的链表。

Java 库有一个双向链表,但没有单链表;你需要自己写。

互联网上有几个很好的实现;查看this answer on the codereview site,了解如何实现自己的单链表。

【讨论】:

【参考方案3】:

不,ArrayList 由数组支持。数组利用连续存储(即数组的开头 + 数组中存储的任何大小的偏移量 == 下一个元素)。 Java 有一个LinkedList 类,但是,这是一个双向链表,这意味着它包含两个引用:一个指向前一个元素,一个指向下一个元素。

Java 没有单链表作为内置数据结构。问题要么是要求您编写自己的单链表实现,要么是说要使用单链表时是不正确的。

【讨论】:

【参考方案4】:

不 - ArrayList 根本不是一个链表 - 它是一个数组列表。 ArrayList 将其元素存储在数组中,而链表通过将对象链接在一起将它们存储在任意内存中。

LinkedList 是一个双向链表,我敢肯定有各种单链表实现可供您使用,但鉴于这是一个任务,如果您尝试,您将被标记或彻底失败使用其他人的实现来提交代码。

相反,找到一个描述链表的article 等,并尝试自己实现一个。

通常这些是通过类SomeClass 构建在java 中的,该类包含SomeClass 类型的前向链接和一个值。您可以通过前向链接将每个 SomeClass 实例链接到下一个实例来构建列表。

【讨论】:

【参考方案5】:

在商业生活中,您的解决方案是完美的,但不幸的是,似乎要求您使用在标准 Java 中不存在的单链接列表。 (并且没有多大意义) 对于培训目的,您必须编写自己的列表。

【讨论】:

出于好奇,为什么说单链表在java中没有意义? @Jeff ArrayList 在内部使用 memcopy,这使得它在所有操作中都比linkedlist 更快,即使在删除时,理论上应该更快,但不是。 啊,我明白你的意思了。我以为你是说单链表在 java 中天生不合逻辑是有原因的。 @jeff 是的,那句话里有点隐藏的宝石【参考方案6】:

名称"Array"List 表明底层实现使用“数组”进行管理。每当我们谈论"Linked"List 时,我们实际上是在考虑“节点化”列表,即每个元素都有一个指向前向节点的指针(如果是双向链表,则是前一个节点)。至少this DSA book(Granville Barnett 和 Luca Del Tongo)是这么说的。

【讨论】:

以上是关于ArrayList 和单链表一样吗?的主要内容,如果未能解决你的问题,请参考以下文章

Redis双端链表

单链表创建之--头插法创建带头结点的单链表,超详细

JavaLearn#(15)集合提升训练:手写ArrayList单链表LinkedListHashMapHashSet新一代并发集合类

JavaLearn#(15)集合提升训练:手写ArrayList单链表LinkedListHashMapHashSet新一代并发集合类

单链表 /*数组法*/

Java重要类之LinkedList