在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();
}
}