在集合集合中添加元素的最快方法

时间:2016-05-24 10:59:46

标签: java treeset

我有一个在树集中添加的任务> 10000000个序列元素。

如果我使用

for (long index = 0; index < 10000000; index++)
    {
        result.add(index);
    }

需要8083毫秒。是否有任何解决方案可以提高此任务的性能?

https://github.com/cyberterror/TestRanges

P.S。目前最快的方法是:List<Integer> range = IntStream.range(0, 10000000).boxed().collect(Collectors.toList());,结果为~370 ms

4 个答案:

答案 0 :(得分:1)

您已经按正确的顺序添加项目,TreeSet将在每个复杂的添加项目后自行排序,LinkedHashSet只保留插入顺序。

因此,如果你真的需要一个Set来实现LinkedHashSet实现,就像这里:

Set<Long> result = new LinkedHashSet<Long>();
for (Long index = 0L; index != 10000000L;) { //Avoid autoboxing
    result.add(index++);
}

在这里阅读: https://dzone.com/articles/hashset-vs-treeset-vs

答案 1 :(得分:1)

你真的需要收藏吗?为了这个目的,如果是这样的话? 实际上,使用普通阵列可以提高性能。

   long [] ar = new long[10000000];
    for (int i = 0; i < 10000000; i++) {
        ar[i] = (long )i;
    }

...

BUILD SUCCESS
------------------------------------------------------------------------
Total time: 0.553 s

UPD:实际上,可以使用Arrays实用程序对阵列执行大多数操作

long [] ar = new long[10000000];
for (int i = 0; i < 10000000; i++) {
    ar[i] = (long )i;
}

long[] copyOfRange = Arrays.copyOfRange(ar, 50000, 1000000);

...

BUILD SUCCESS
------------------------------------------------------------------------
Total time: 0.521 s

答案 2 :(得分:1)

尝试HPPC:Java的高性能原始集合

许可证:Apache License 2.0

<dependency>
  <groupId>com.carrotsearch</groupId>
  <artifactId>hppc</artifactId>
  <version>0.7.1</version>
</dependency>

LongHashSet在1190ms执行:

LongSet result = new LongHashSet();
for (Long index = 0L; index < 10000000L;) {
  result.add(index++);
}

LongScatterSet在850ms内执行:

LongSet result = new LongScatterSet();
for (Long index = 0L; index < 10000000L;) {
  result.add(index++);
}

答案 3 :(得分:0)

TreeSet是一个平衡的红黑树。每次添加新项目时,树都要平衡需要花费很多时间。尝试以不同的顺序添加项目;实际上按此顺序:

  • 5 000 000 - 中间0和10 000 000(你的规模是10 000 000)
  • 2 500 000 - 中间0和5 000 000
  • 7 500 000 - 中间的5 000 000和10 000 000
  • 中间的数字为0和2 500 000
  • 中间数为2 500 000和5 000 000
  • 中间的数字为5 000 000和7 500 000
  • 7 500 000和10 000 000中间的数字

这样,您将保持树的平衡,不会执行任何其他操作(以平衡树)。 只需确保您的算法计算下一个要添加的数字并不太复杂。