【发布时间】:2014-08-15 01:44:46
【问题描述】:
我想知道.size() 方法的性能。此方法是否从列表中的对象数量返回引用(例如每次将对象添加到列表时递增的类成员)?还是遍历所有对象?
哪个效率更高?
每次都拨打.size():
List<Vector3> objects = getCoords();
for (int x = 0; x < objects.size(); x++){
for (int y = 0; y < objects.size(); y++){
for (int z = 0; z < objects.size(); z++){
drawShape(x, y, z);
}
}
}
或者通过保存到局部变量:
List<Vector3> objects = getCoords();
int size = objects.size();
for (int x = 0; x < size; x++){
for (int y = 0; y < size; y++){
for (int z = 0; z < size; z++){
drawShape(x, y, z);
}
}
}
假设列表中有 > 30.000 个对象。
哪个更快/更高效?
我们使用ArrayList<T> 或List<T> 是否重要?
简单的语句呢:.size() 或 .isEmpty()
if (objects != null && objects.size() > 0){
doThis();
}
或致电.isEmpty()
if (objects != null && !objects.isEmpty()){
doSomethingElse();
}
【问题讨论】:
-
类成员,如果没记错的话。您可以挖掘各种实现的源代码以找出答案,但我真的怀疑是否会采用迭代方法。太多的性能损失不能保证 4 字节的内存节省。如果尺寸不变,您的两个循环 可以 等效,并且我 认为 在这种情况下 JITC 可以将一个循环转换为另一个循环。是否使用
ArrayList<T>或List<T>是一个灵活性问题。最后,您选择实际的实现。size()和isEmpty()解决不同的问题。 -
getCoords()返回什么类型的List?这可能无关紧要,但值得注意的是List只是一个接口,因此它的实现可能会有不同的行为。 -
无需“挖掘”。查看源代码。至于 ArrayList vs List:一个是接口。将界面保留在作业的左侧有其优势(更多信息请参见 SO 上的某处)
标签: java performance list