【问题标题】:Java List size() performance and tips [duplicate]Java List size() 性能和技巧 [重复]
【发布时间】: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&lt;T&gt;List&lt;T&gt; 是否重要?

简单的语句呢:.size().isEmpty()

if (objects != null && objects.size() > 0){
   doThis();
}

或致电.isEmpty()

if (objects != null && !objects.isEmpty()){
   doSomethingElse();
}

【问题讨论】:

  • 类成员,如果没记错的话。您可以挖掘各种实现的源代码以找出答案,但我真的怀疑是否会采用迭代方法。太多的性能损失不能保证 4 字节的内存节省。如果尺寸不变,您的两个循环 可以 等效,并且我 认为 在这种情况下 JITC 可以将一个循环转换为另一个循环。是否使用ArrayList&lt;T&gt;List&lt;T&gt; 是一个灵活性问题。最后,您选择实际的实现。 size()isEmpty() 解决不同的问题。
  • getCoords() 返回什么类型的List?这可能无关紧要,但值得注意的是List 只是一个接口,因此它的实现可能会有不同的行为。
  • 无需“挖掘”。查看源代码。至于 ArrayList vs List:一个是接口。将界面保留在作业的左侧有其优势(更多信息请参见 SO 上的某处)

标签: java performance list


【解决方案1】:

Java List 使用实例变量来处理大小。增加时增加,减少时减少。调用 list.size() 返回一个变量,因此是 O(1)。

List.size()(理论上)看起来像:

public int size() {
    return this.size;
}

调用List.isEmpty() 是对实例变量size 是否等于0 的布尔检查。

public boolean isEmpty() {
    return (this.size==0);
}

由于这是一个实例变量,所以(据我所知)您使用什么类型的List 并不重要,因为它们都继承了一个通用接口并具有所需的add() 和其他功能。

【讨论】:

  • 这取决于List接口的实现。
  • 我认为所有标准的Lists 都会存储大小,但可以想象用户制作的不会。
  • instance 变量代替 class 变量会更容易理解。第二个通常是指静态成员变量。
  • @keyser 很好,我的答案已被编辑。
  • 是的,可以在某处输入“实施”一词:p
猜你喜欢
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多