Java ArrayList或链表-如果要执行插入/删除和查找操作,则使用哪个集合

Java ArrayList或链表-如果要执行插入/删除和查找操作,则使用哪个集合,java,arraylist,Java,Arraylist,我们知道,链表是用于快速插入和删除的 数组列表用于快速查找 我要求在列表中保存10000条记录。我会用哪一套。 可以对该列表执行查找和插入/删除操作 我应该使用哪一个收藏以及原因? 或 我会使用自己创建的收藏吗 每次需要选择适合您的问题的数据结构时,请在下面的链接中检查这些表 插入 LinkedList 插入第一个-O(1) 插入最后一个-O(1) 插入任意位置-O(n)-这是因为需要通过索引找到插入的位置 ArrayList 插入第一个-O(n) 插入最后一个-O(1) 插入任意位置-O(n)

我们知道,链表是用于快速插入和删除的 数组列表用于快速查找

我要求在列表中保存10000条记录。我会用哪一套。 可以对该列表执行查找和插入/删除操作

我应该使用哪一个收藏以及原因? 或
我会使用自己创建的收藏吗

每次需要选择适合您的问题的数据结构时,请在下面的链接中检查这些表

插入

LinkedList

插入第一个-O(1)

插入最后一个-O(1)

插入任意位置-O(n)-这是因为需要通过索引找到插入的位置

ArrayList

插入第一个-O(n)

插入最后一个-O(1)

插入任意位置-O(n)


因此
LinkedList
ArrayList
在任何位置都具有相同的O(n)insert

删除

LinkedList

删除第一个-O(1)

删除最后一个-O(1)

删除anywhere-O(n)-这也是因为需要通过索引找到要删除的位置

ArrayList

删除第一个-O(n)

删除最后一个-O(1)

删除任意位置-O(n)

所以
LinkedList
ArrayList
在任何地方都有相同的O(n)delete


正如您所看到的,插入和删除两者的任意位置是相同的。 如果总是执行insert last操作,则适合使用ArrayList,因为如果知道索引,则LinkedList的查找为O(1)和O(n)。我认为你需要找到更适合使用的黄金中间

另外,如果你不关心dublicate free,你可以使用HashSet。它基于哈希表,并为插入和删除、查找提供合适的性能(O(1)、O(许多情况下为log(n))

HashSet-jdoc

假设散列函数将元素>正确地分散在存储桶中,该类为基本操作(添加、删除、包含和大小)提供恒定的时间性能


无需查看数据,除非您的用例涉及大量使用a(=获取
O(1)
LinkedList上插入和删除的方法)的插入和删除操作(当不在任何一端操作时),否则真实世界的性能将有利于
ArrayList
,因为其开销更低,指针解引用更少

在您的选择中非常重要的因素:

  • 列表中有什么?如果列表是小对象的集合(例如,
    Integer
    ),则来自
    LinkedList
    的开销将更加明显。
    LinkedList
    中的每个节点至少需要2个额外的指针,每个节点的开销估计约为8字节。内存越多,意味着缓存未命中越多,性能越低
  • 如何准确地插入和删除?如果只在列表末尾插入和删除,则
    ArrayList
    是一种方法。如果在随机位置插入和删除,则ArrayList可能仍然是一种方法(因为扫描速度更快)。只有当您需要在开始时插入,和/或一致使用
    ListIterator
    时,才能真正看到
    LinkedList
    的性能优势
  • 您的列表有多无序,需要多久执行一次完整扫描?虽然理论上所有内存访问都需要相同的时间,但在RAM中迭代相邻的元素(由于处理器缓存)要比到处跳跃更快
  • 最后-您是否考虑过使用
    Set
    Map
    来加快搜索和访问速度?O(n)list access可以快速汇总,特别是在循环内使用时。Map和Set可以提供
    O(log n)
    O(1)
    访问(取决于实现),从而显著提高性能

    一些参考资料:

    • (c#但适用于Java)
    • (c++但列表vs向量讨论适用于Java——以LinkedList vs array的方式)

    你的第一句话过于简单化了。如果不知道你在代码中真正做了什么,我们就无法判断。对于大多数用例,ArrayList是正确的选择。Hashmaps/hashsets:O(1)对于remove/update/insert,平均值为m=n(如果bucket数=m,元素数=n)。最糟糕的情况复杂性是O(logn),自Java8以来,由于哈希桶下的平衡树。