size()
类ArrayList
类只是一个getter,还是执行任何类型的计算?
如果它是一个吸气剂,那么可以安全地假设如果我多次调用它会在某个时刻内联它吗?
答案 0 :(得分:2)
如果你在询问调用“size()”是否有任何开销,答案是“否”。
以下是对类似方法String.length()的类似讨论:
In Java, for a string x, what is the runtime cost of s.length()? Is it O(1) or O(n)?
两种情况下的答案 - String.length()和ArrayList.size() - 都是“O(1)”。
答案 1 :(得分:1)
size()
方法不是标准的setter / getter,它是List
的一种方法,它被定义为给出list
(元素数量)的大小
ArrayList
通过以下方式实现它
public int size() {
230 return size;
231 }
它维护一个名为int
的{{1}}变量,当我们添加它时会增加,删除会减少。
答案 2 :(得分:1)
是否会内联ArrayList.size()
取决于许多因素,但是,是的,至少在理论上,如果您引用size()
足够的时间并且如果满足所有其他内联标准那么它将被内联。
大多数情况下,ArrayList只是一个类,与您可能编写的类不同。所以它将遵循相同的内联规则/潜力。
[刚检查了ArrayList的源代码,这是我发现的:
public int size() {
return size;
}
这就像你可以得到的香草(和高度内联能力)。所以我会说size()
几乎会在某些情况下内联,你不会以某种方式严重模糊类类型。]
答案 3 :(得分:1)
如果您希望真正了解如何实现 size()方法,您可以下载GNU GPL下的Java库源代码; OpenJDK 6源代码中的第196行。
关于内联的主题,您可能希望阅读以下帖子:
答案 4 :(得分:0)
由于getter只返回一个字段,因此不会对性能产生负面影响。 JIT非常智能,可以内联调用,因此您不需要函数调用开销。
在此处查看类似问题:Is ArrayList.size() method cached?