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

在java、iter.remove()或collection.clear()中,哪个更适合读取和删除整个集合?,java,performance,Java,Performance,比较 synchronized(countList){ while(iter.hasNext()){ Entry=iter.next(); 如果(entry.getVaue>0) entry.output(); } countList.clear(); } 与 synchronized(countList){ while(iter.hasNext()){ Entry=iter.next(); 如果(entry.getVaue>0) entry.output(); iter.remove();

比较

synchronized(countList){
while(iter.hasNext()){
Entry=iter.next();
如果(entry.getVaue>0)
entry.output();
}
countList.clear();
}

synchronized(countList){
while(iter.hasNext()){
Entry=iter.next();
如果(entry.getVaue>0)
entry.output();
iter.remove();
}
}

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

我想每个条目都会调用iter.remove,对吗?最好是在最后调用clear,或者只是让收集被垃圾收集,这样(逐个删除时性能会下降-这取决于收集实现的速度有多慢)

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

在某些情况下,
N
remove()
s通过迭代器将产生
O(N log N)
,或者更糟的是,
O(N^2)
性能(例如在
数组列表上)。我想不出有哪种情况下
clear()
的性能会如此糟糕

我认为
clear()
可能更好。它是作为一个操作完成的,因此实现可以更好地优化它,因为它不是对
remove()

此外,集合迭代器必须防止
IllegalStateException
和/或
ConcurrentModificationException
。使用
N
remove()
s,即
N
检查,这可以相加。最后,提醒一下,并不是所有迭代器都支持
remove()

这样想:

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

为什么不对其进行基准测试并查看?@Andrew,考虑同步,速度更快。您的集合的具体类型是什么?您是否错过了在
synchronized
块中从集合中获取迭代器的位置?顺便说一句:您可能想查看代码的格式。太糟糕了。大括号,很好。为什么评论clear()更好,然后提供一个使用remove()的示例?请参阅Polygene润滑油的ResponseProperty。根据定义,clear至少也会一样好,而且除了极少数例外,会好几个数量级。
    synchronized (countList) {
        while (iter.hasNext()) {
            Entry<Long, Long> entry = iter.next();
            if(entry.getVaue>0)
                 entry.output();
            iter.remove();
        }
    }
synchronized (countList) {
    while (iter.hasNext()) {
        Entry<Long, Long> entry = iter.next();
        if(entry.getVaue>0) {
             entry.output();
        }
        iter.remove();
    }
}