每次迭代多次使用ArrayList.get()会对性能产生影响吗?

时间:2017-02-24 14:35:11

标签: java android performance

对于Android开发,一般来说,执行以下操作会更昂贵: (例1)

for(int x=0; x < largeObjectCollection.size(); x++){
    largeObjectCollection.get(x).SomeValueOne   = "Sample Value 1";
    largeObjectCollection.get(x).SomeValueTwo   = "Sample Value 2";
    largeObjectCollection.get(x).SomeValueThree = "Sample Value 3" ;
    //Continues on to over 30 properties...
}

通过此实现(示例2)

for(int x=0; x < largeObjectCollection.size(); x++){
   SampleObjectIns myObject = largeObjectCollection.get(x);
   myObject.SomeValueOne   = "Sample Value 1";
   myObject.SomeValueTwo   = "Sample Value 2";
   myObject.SomeValueThree = "Sample Value 3" ;
   //Continues on to over 30 properties...
}

在多次使用.get()而不是每次迭代创建该对象的新实例时,我都找不到性能影响的细分。

我认为.get()在资源方面没有太多用处,因为元素的位置已经知道,但是当处理许多属性时,最好只获取该对象一次如例2所示?

3 个答案:

答案 0 :(得分:3)

在循环结构中多次调用'2015-02-28' 方法没有性能影响。

get()方法不会搜索任何类型的东西。该位置是已知的,因此RAM中的确切位置也是已知的。所以它只需要做一次RAM访问,这是一个c onstant time操作 - O(1)

因此,您可以多次使用它而不会对性能产生任何影响。但更简洁的方法是使用get()一次,将其存储在局部变量中并重新使用该变量。

答案 1 :(得分:1)

第一个案例显然是可以做更多工作的案例。至少有两种可能性:

  • JIT可能能够确定列表值没有变化,并且您正在重复请求相同的值;因此它有效地将其转换为第二种形式。
  • ArrayList.get操作非常快;它基本上只是进行数组查找,它查找的值已经在缓存中,因为你只是查找了它。

    因此,您的时间测量主要取决于您正在进行的其他工作。所以,即使你进行了29次以上get次呼叫,也只是一个很小的数字的30倍。

答案 2 :(得分:0)

唯一的理由是,get操作对于数组来说真的很快,这就是为什么性能几乎没有显着差异。