ArrayList中size()方法的用途

时间:2012-01-05 04:25:15

标签: java list

size()ArrayList类只是一个getter,还是执行任何类型的计算?

如果它是一个吸气剂,那么可以安全地假设如果我多次调用它会在某个时刻内联它吗?

5 个答案:

答案 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行。

OpenJDK 7 Sources

关于内联的主题,您可能希望阅读以下帖子:

Inlining in Java

答案 4 :(得分:0)

由于getter只返回一个字段,因此不会对性能产生负面影响。 JIT非常智能,可以内联调用,因此您不需要函数调用开销。

在此处查看类似问题:Is ArrayList.size() method cached?