Java中最快的变量集

Java中最快的变量集,java,performance,structure,Java,Performance,Structure,我需要的结构(Arraylist、LinkedList等)在这种情况下非常快速: 当结构不是空的时候,我在结构中搜索满足条件的元素,比如说k,移除满足k的元素,然后重新开始另一个条件,比如说k+1 e、 g: 对于这种情况,for(int i=1;i应该是最快的。显式地使用迭代器(structure.iterator())并调用迭代器的remove方法,而不是调用structure.remove(element)!我不知道确切的用例,但这里有一个注意事项 如果您的谓词P1..PN已预编译且可用,

我需要的结构(Arraylist、LinkedList等)在这种情况下非常快速: 当结构不是空的时候,我在结构中搜索满足条件的元素,比如说k,移除满足k的元素,然后重新开始另一个条件,比如说k+1

e、 g:


对于这种情况,
for(int i=1;i应该是最快的。显式地使用迭代器(structure.iterator())并调用迭代器的remove方法,而不是调用structure.remove(element)!

我不知道确切的用例,但这里有一个注意事项

如果您的谓词P1..PN已预编译且可用,并且如果您没有修改集合的内容,并且如果您的谓词彼此不依赖,那么您可能希望创建一个复合谓词,如按某种逻辑顺序捆绑N个谓词,然后在集合上只进行一次迭代,执行过滤环法

至于数据结构,我想如果是这样的话:

如果我的过滤谓词是完全任意的,那么应该可以使用列表

在一些非常有限且严格的值集的特定情况下,可以考虑一个树形或类似图的结构,其中可以有一些主节点,这些节点表示属性“PrimeTy1”具有值“Value1”,如果您想删除所有“PrimeTy1”值为“Value1”的项。您可以告诉主节点删除其所有子节点(并且这些子节点应将自己与可能拥有的任何其他父主节点分离)。

排序列表数据结构

如果你自己构造列表,你可以考虑使用<代码>排序的数据结构。它会给你最佳的搜索性能(<代码> log N< /代码>复杂度,所以它非常快)。 链表数据结构 LinkedList为您提供了恒定的元素删除时间,但随机访问并没有恒定的复杂性(速度很慢)


对于您的场景,您必须对LinkedList或排序列表是否更快进行基准测试。

如果元素是基元,那么最快的结构很可能是一个专门的基元集合(例如)。以下对装箱基元的引用几乎肯定会导致缓存丢失,这可能会导致成本下降

出于同样的原因,我不建议使用
LinkedList
:由于缓存未命中,它的速度非常慢

如果顺序不重要,则
ArrayList
是完美的。与其删除元素,不如将其替换为最后一个元素并删除最后一个数组元素。这是一个
O(1)
操作,不会受到空间局部性差的影响

如果顺序很重要,您可以构建自己的类似于
ArrayList
的结构。您不需要删除元素,而是将其标记为删除,例如在
位集中或在
布尔[]
。最后,通过将所有元素移动到正确的位置并调整长度,在一次扫描中执行删除。优化的循环很可能看起来与


一个更简单的解决方案是使用
ArrayList
并将所有幸存的元素复制到另一个。我敢打赌它将轻而易举地击败
LinkedList
。作为一个次要的GC friedly优化,您可以使用两个列表。

如果您的元素是
int
s,我认为位集将是此任务最快的数据结构。迭代将比通过数组列表稍微慢一点(甚至不是标准的
java.util.ArrayList
,只是原语专门化),但删除操作几乎不需要任何成本,而从任何数组列表中删除操作的成本都相当高


注意,直接使用
long[]
作为位集并手动执行逐位操作可以获得很多好处,因为
java.util.BitSet
不是非常注重性能。但是,当然,从
BitSet
开始,您可以不克隆并使用
迭代器
(您可以从迭代器中删除).至于“快”,那就试试吧。我敢打赌,
LinkedList
会因为缓存未命中而变慢。
for (int i = 1 ; i <= 1000000; i++) {
  structure.add(i);
}

d = 2;

while (!structure.isEmpty()) {
  for(int boom : structure.clone) {
    if (boom % d == 2) {
      structure.remove(boom);
    }

    d++;
  }
}