Java LinkedList是不是一个不直观的解决方案,因为我大多数时候都不知道';您不需要知道集合中元素的物理位置吗?

Java LinkedList是不是一个不直观的解决方案,因为我大多数时候都不知道';您不需要知道集合中元素的物理位置吗?,java,linked-list,Java,Linked List,最近,一位同事向我展示了他用LinkedList编写的一些代码,我无法理解 a->b->c->d->e->f 如果我想从LinkedList中得到d,我不是必须遍历列表,从a开始迭代到d,还是从f开始迭代到d 为什么我关心d在集合中的物理存储位置?在添加和删除元素方面,链表通常比数组具有更好的性能特征 是的,如果您对排序数据进行操作,您通常会关心存储在哪个顺序元素中。不是每个链接列表都在两个方向上链接,但通常是这样。这种类型的集合具有正向、正向和反向的顺序访问功能 优点是: 除平面阵列外,内存

最近,一位同事向我展示了他用LinkedList编写的一些代码,我无法理解

a->b->c->d->e->f

如果我想从LinkedList中得到d,我不是必须遍历列表,从a开始迭代到d,还是从f开始迭代到d


为什么我关心d在集合中的物理存储位置?

在添加和删除元素方面,链表通常比数组具有更好的性能特征


是的,如果您对排序数据进行操作,您通常会关心存储在哪个顺序元素中。

不是每个链接列表都在两个方向上链接,但通常是这样。这种类型的集合具有正向、正向和反向的顺序访问功能

优点是:

  • 除平面阵列外,内存开销最小
  • 非常快速的插入和删除
  • 内存可以一次分配和释放一个元素
  • 易于实现(在现代语言中不太重要,但在C89和C99中很重要)
  • 后进先出或先进先出订购是可能的

    • 我认为正确的问题不是在哪里,而是它如何存储您的收藏。根据这一点,您添加、搜索、删除和保持收藏一致的时间是不同的。因此,在选择类型集合时,您应该记住最频繁的操作是什么,并为您的情况选择最佳解决方案。

      您可能不在乎,无论您使用的是LinkedList还是ArrayList。LinkedList的优点是能够轻松地将元素添加到列表的开头,而这是ArrayList所无法做到的。

      列表与“物理位置”无关(无论您的意思是什么),列表是一种特定的数据结构,可以增长和收缩,并在各种操作中提供相当的复杂性。

      您不必像
      LinkedList提供的那样显式遍历链接列表。它们仍将遍历列表,但会隐式执行


      您将关心集合如何排序项,因为这会影响集合操作的效率,特别是插入、获取和删除。集合中项目的任何排序也会影响使用数据结构的算法的计时。

      这是一个糟糕的问题标题。我找不到“非直观”和“物理元素”之间的任何联系。请你把标题改一下,以澄清你的问题。这真的很难解析。你想知道什么?但是得到d比插入g更重要吗?还是比删除b更重要?因为不回答这些问题,你就不知道什么样的结构适合你的需要。这可能是因为抓取的成本有点高,但是如果每1k插入只进行一次,那么与插入速度相比,您为什么会关心抓取速度呢?特别是,如果您迭代列表(这实际上是对集合最常见的操作之一),它实际上并不比其他任何东西慢。图中的列表是“单独链接”的,因此您只能朝一个方向(向前)移动。。使用“双链接”列表,您可以双向旅行。abcdef但您存储的指针是原来的两倍,并且在添加/删除指针时必须使两个指针保持同步。请注意,您可以保留指向列表上任何点的链接(mypointer->d),但除非遍历该项,否则无法保证该项仍在列表上。只需知道LinkedList的遍历速度(通常)比ArrayList慢,但插入/删除速度更快。