繁体   English   中英

ArrayList-LinkedList澄清

[英]ArrayList - LinkedList Clarification

谁能清楚地告诉我为什么?

在ArrayList中读取很简单,(我们可以通过其数组索引进行访问),为什么不在linkedList中读取

我听说为什么在arrayList中插入元素很难? 容易在linkedList中为什么?

删除元素数组列表中是艰难的,为什么? 容易在linkedList中为什么?

我知道一些关于数组的知识,但是在linkedXXX中发生了什么

谢谢。

在ArrayList中,您将引用数组保留在内存中,也就是说,您拥有一个内存位置。 当您要求ArrayList的第一个元素时,您只需访问内存位置。 访问第10个元素时,将访问存储位置+引用大小的10倍。

在LinkedList中,您有一个元素,它引用了下一个。 下一个引用下一个,依此类推。 如您所见,没有一种直接访问LinkedList中第10个元素的方法,而不是一个接一个地获取下一个元素。

因此,您的问题是:

我听说为什么在arrayList中插入元素是触摸? 容易LinkedList的,为什么?

将元素插入ArrayList有两个问题:

  1. 当您将元素放置在位置3时,您需要首先移动从位置3开始的每个元素,并将它们向右移动一次(3变成4,4变成5,依此类推),以便3变成空,然后您可以将新元素

  2. 如果支持ArrayList的阵列已满,则需要创建一个新阵列! 这是非常昂贵的,因为您需要再次分配内存, 然后将所有元素复制到新数组中并销毁旧数组。

另一方面,在“链表”中,您转到元素1,该元素指向2,然后转到2。在2中,存在对旧元素3的引用,该元素临时存储在其他位置。 您将其替换为对新元素的引用,并在新元素中指向旧的3。因此,这将降低成本。

为什么删除arraylist中的元素? 容易LinkedList的,为什么?

与插入类似的原因。 在ArrayList中,您必须再次将所有元素向下移动,在LinkedList中,一旦您位于元素2,则将其下一个点指向4,并删除3。

为了完整起见,如果您要以随机顺序访问元素,则ArrayLists很棒,但是存在加法和减法的问题。 添加和删​​除LinkedList很棒,但是获取不是第一个或最后一个元素的元素会产生额外的费用。 因此,总会有一个权衡!

ArrayList由数组支持,该数组不能增长或缩小,也不能插入或删除元素。 因此,插入和删除操作是昂贵的操作,因为必须创建一个新数组,并将现有值从一个数组复制到另一个数组。 但是可以通过索引访问数组,因此在这里随机访问要快得多。

LinkedList由节点对象组成,这些节点对象在一个方向或两个方向上都具有相互指向的指针(是的,我知道)。 删除这些节点之一或插入一个新节点,但获得节点nr的成本非常低廉。 12345,您必须从头开始并遍历12344个节点,这意味着此处的随机访问非常昂贵。 注意:Java LinkedList不仅是List,而且还实现了QueueDeque接口。

我认为两者都同样适合简单迭代,但是底层机制却完全不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM