Java 是否为最后一个字符串调用String.length()?
一个快速获得心灵平静的方法:Java 是否为最后一个字符串调用String.length()?,java,string,final,Java,String,Final,一个快速获得心灵平静的方法: 考虑到以下几点: final String str = "This is the end"; 是在运行时计算str.length()还是在字节码中硬编码为15?在字节码中,将对该方法进行计算 但是,方法调用可能会在过程中内联 String.length()方法的代码如下所示: public int length() { return count; } 我不认为对字符串的引用被声明为final这一事实对本例中的内联有任何影响 str.length()在运行
考虑到以下几点:
final String str = "This is the end";
是在运行时计算
str.length()
还是在字节码中硬编码为15?在字节码中,将对该方法进行计算
但是,方法调用可能会在过程中内联
String.length()方法的代码如下所示:
public int length() {
return count;
}
我不认为对字符串的引用被声明为final这一事实对本例中的内联有任何影响 str.length()
在运行时进行计算final
表示不能更改引用的值。它与字符串本身无关
但是,如果您查看
String
的源代码,您将看到length()
返回字段的值,因此不进行计算,值os只需读取…
在字符串构造函数中计算,并保存在私有final int count中
,str.length()
只返回count
变量。我刚刚检查了这里的源代码,javac
编译器不太可能对它进行优化,但是如果你运行足够的代码来预热它,JIT很可能会优化它。为什么要在意呢?这可能依赖于JVM实现,但在和JVM下可能会很快。如果这被证明是一个性能瓶颈(不太可能),探查器将显示它。字符串在Java中是不可变的。是否将变量设置为final并不重要。它确实重要,但不在问题的范围内。最后一个变量不能被重新分配,而普通变量可以。这意味着…该值是在运行时计算的&然后由jit编码?