比较
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
方法。
答案 0 :(得分:12)
在某些情况下,N
remove()
通过迭代器会产生O(N log N)
,甚至更糟糕的O(N^2)
性能(例如在ArrayList
上)。我想不出任何clear()
表现不佳的情况。
我会说clear()
可能更好。它是作为一个操作完成的,因此实现可以更好地优化它,因为它不是对remove()
的集合的增量修改(需要维护不变量等)。
此外,集合迭代器必须防范IllegalStateException
和/或ConcurrentModificationException
。使用N
remove()
s,N
检查,可以加起来。最后,作为提醒,并非所有迭代器都支持remove()
。
这样想:
remove()
操作是通过中间人(迭代器)完成的,它会在集合变为空之前将集合置于N
个不同状态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();
}
}