哪个更适合在java,iter.remove()或collection.clear()中读取和删除整个集合?

时间:2010-02-26 02:50:41

标签: java performance

比较

    synchronized (countList) {
        while (iter.hasNext()) {
            Entry<Long, Long> entry = iter.next();
            if(entry.getVaue>0)
                 entry.output();
        }
        countList.clear();
    }

    synchronized (countList) {
        while (iter.hasNext()) {
            Entry<Long, Long> entry = iter.next();
            if(entry.getVaue>0)
                 entry.output();
            iter.remove();
        }
    }

有真正的区别吗?我猜测垃圾收集可能更适合collection.clear方法。

2 个答案:

答案 0 :(得分:12)

在某些情况下,N remove()通过迭代器会产生O(N log N),甚至更糟糕的O(N^2)性能(例如在ArrayList上)。我想不出任何clear()表现不佳的情况。

我会说clear()可能更好。它是作为一个操作完成的,因此实现可以更好地优化它,因为它不是对remove()的集合的增量修改(需要维护不变量等)。

此外,集合迭代器必须防范IllegalStateException和/或ConcurrentModificationException。使用N remove() s,N检查,可以加起来。最后,作为提醒,并非所有迭代器都支持remove()

这样想:

  • N remove()操作是通过中间人(迭代器)完成的,它会在集合变为空之前将集合置于N个不同状态
  • 1 clear()是对集合的直接操作,它只有1个状态转换

答案 1 :(得分:0)

我认为iter.remove是为每个条目调用的,对吧?它更好(在逐个删除时性能下降 - 它取决于集合实现多慢)在最后调用clear或者只是让集合被垃圾收集。

synchronized (countList) {
    while (iter.hasNext()) {
        Entry<Long, Long> entry = iter.next();
        if(entry.getVaue>0) {
             entry.output();
        }
        iter.remove();
    }
}