Java是一种OOP语言,它有多个用于各种目的的内置类和方法。一个这样的例子是String
类。方法length()
确定字符串的长度。
例如,
String str = "hello";
for(int i=0;i<str.length();i++)
{
//code
}
这里,如果变量i小于字符串的长度,则评估条件,然后循环迭代。但是,它是否确定每次的长度?
方法length()
是否在每次评估条件之前调用?如果是这种情况,则Java会将变量的值内部存储在寄存器中以便快速访问(或)程序员必须明确地这样做:
String str = "hello";
int len = str.length();
for(int i=0;i<len;i++)
{
//code
}
这种方法效率如何?
答案 0 :(得分:2)
现代JIT可能会注意到length()是一个返回最终原始值的final类的简单getter,并用int值本身替换方法调用。对于C,在其他语言中,优化惩罚是正确的,但是不是java。 C&C的strlen遍历char数组,寻找字符串结尾的字符。
答案 1 :(得分:0)
String#length
只是指一个变量。没有其他的。
结构是这样的:
class String {
private int length;
public int length() {
return length;
}
}
字符串是不可变的,所以没有理由首先改变它;唯一需要计算长度的时间是创建String
的时间。
通常的做法是在需要时执行计算,更新size
变量,然后在需要获取大小时参考getter。这样你就不会浪费时间计算它没有改变的大小。您可以在ArrayList
至于“幕后”优化,它取决于VM实现,以及正在执行的代码。可以执行内联,以及一些运行时优化。但最终,它取决于代码和VM。