【发布时间】:2014-12-10 01:05:11
【问题描述】:
在下面的两种样式中,分配了一个Iterator 对象。在迭代之前检查集合是否为空是否有用?我不知道这是否符合“过早优化”的条件。希望对 JVM 垃圾收集器有深入了解的人可以提供见解。
另外,我不知道 Java 编译器如何处理 for-each 循环。我假设样式 B 会自动转换为样式 A 。但是...可能包括一张空支票。
循环样式 A
Collection<String> collection = ...
Iterator<String> iter = collection.iterator();
while (iter.hasNext()) {
String value = iter.next();
// do stuff
// maybe call iter.remove()
}
循环样式 B
Collection<String> collection = ...
for (String value : collection) {
// do stuff
}
循环样式 A(修改)
Collection<String> collection = ...
if (!collection.isEmpty()) {
Iterator<String> iter = collection.iterator();
while (iter.hasNext()) {
String value = iter.next();
// do stuff
// maybe call iter.remove()
}
}
循环样式 B(修改)
Collection<String> collection = ...
if (!collection.isEmpty()) {
for (String value : collection) {
// do stuff
}
}
【问题讨论】:
-
为什么要检查空,那是最糟糕的防御性编程!检查
null是一回事,但检查空是不好的做法。 -
为什么?我可以看到好处...而不是访问迭代器并检查方法调用以查看是否存在
next,这是JVM 将在for(Object obj : objects)上执行的操作,它只会绕过所有代码,如果集合是空的......据我所知,这是一个优化,现在如果它是一个好的,那是另一回事...... -
似乎所有现有答案都错过了micro-optimization 标签,这是一个性能不正确的问题。
标签: java collections garbage-collection iteration micro-optimization