当我运行以下程序时,大约需要7到8分钟才能执行。我真的不确定我在哪里弄错了,因为该程序要花很多时间才能执行。

public class Test {
            public static void main(String[] args) {
            final Integer[] a= new Integer[1000000];
            for (int i=0; i < a.length; i++) {
                a[i] = i;
            }
            final List<Integer> source = Arrays.asList(a);
            final Set<Integer> set = new CopyOnWriteArraySet<Integer>(source);
        }
    }


有人可以帮我理解一下,为什么这个程序太慢了。

我的机器是具有4GB RAM的Core I7

最佳答案

我已经测试过了,确实已经向构造函数提供了1 000 000个元素的列表,这花费了很长时间(7分钟)。

这是Open JDK 2013-01-09上的参考问题:
JDK-8005953 - CopyOnWriteArraySet copy constructor is unusable for large collections

该问题将由CopyOnWriteArrayList#addAllAbsent()构造函数调用的CopyOnWriteArraySet方法引起。

问题摘录:


  CopyOnWriteArraySet的副本构造函数太慢了
  集合。仅需一台开发人员笔记本电脑就需要10多分钟
  收藏中的100万个条目将被复制...


作为解决方案状态,您可以阅读:无法修复。
您可以阅读最后一条消息:


  对于较大的输入,可以使addAllAbsent更快,但这会影响
  小尺寸的性能。据记载
  CopyOnWriteXXX类更适合于小型集合
  大小。


CopyOnWriteArraySet javadoc确实指定了这一点:


  最适合通常需要固定尺寸的应用
  小型只读操作远远超过了变异操作,并且
  您需要防止遍历期间线程之间的干扰。

07-22 12:18