我有一个很简单的函数。
在这个函数中,我有很多调用列表大小(包含大约10个元素):
list.size()
使用临时变量只获取一次是否更快,或者每次调用size()
方法更快?
更新:这是ArrayList
。
注意:我知道自己在做什么,我不是在寻找有关优化以及应该或不应该如何进行的演讲。我只是在寻找答案。
答案 0 :(得分:10)
完全取决于实施。您尚未指定list
的类型 - 我认为它是List<E>
或具体实现。
在某些实现中,例如ArrayList<E>
它非常便宜 - 基本上是一个字段访问。诚然,只有记录才是恒定的时间:
size
,isEmpty
,get
,set
,iterator
和listIterator
操作会在固定时间内运行。
在其他地方,可能可能很昂贵。该界面不提供任何保证。我希望在大多数实现中它很便宜(恒定时间),但你永远不知道......
答案 1 :(得分:7)
这取决于List
的实施
查看ArrayList
的来源
/**
225 * Returns the number of elements in this list.
226 *
227 * @return the number of elements in this list
228 */
229 public int size() {
230 return size;
231 }
232
因此,如果您使用局部变量或调用此方法
,则无关紧要答案 2 :(得分:4)
检查出来(来自ArrayList
和LinkedList
):
/**
* Returns the number of elements in this list.
*
* @return the number of elements in this list
*/
public int size() {
return size;
}
调用list.size()
与调用方法并在堆栈上放置值一样高效:(几乎)可以忽略不计。当然,使用本地(final
)变量可以更快一些。如果这是您申请环境中的重要改进,您可能需要进行衡量。
答案 3 :(得分:0)
无论size()
方法调用有多快。如果在一个代码块内多次调用该方法,假定该方法不会改变任何东西,那么引入一个变量来携带方法的结果是一个好习惯。