我试图了解String类中的length成员是否为整数常量?我以为不是。
答案 0 :(得分:6)
它不是JLS 15.28意义上的编译时间常数表达式。
表达式str.length()
是一个方法调用,没有明确的方法调用是常量表达式。即使String是文字,也是如此;也就是说,根据JLS,"hello".length()
不是编译时常数表达式。
它是一个运行时常量,从某种意义上说,一旦创建String
,长度就不能更改。这是因为Java字符串是不可变的。
您可以通过查看(标准)String
类的任何版本的源代码来确认这一点。该代码在不同版本之间可能会有所不同,但是“运行时稳定性”属性在所有版本中都将保持不变。
(实际上,以上内容并不完全正确。如果您愿意使用 bad 反射来破坏封装,则可以修改String
的私有成员并进行变异它可以更改length()
返回的值,您可以通过本机代码方法和可能的其他方法来达到相同的效果,但是……只是……不要这样做!您做这种事情,您的Java代码的行为是未指定。)
答案 1 :(得分:4)
根据String
类source code的length()
(jdk9):
public int length() {
return value.length >> coder();
}
value
是
@Stable
private final byte[] value;
coder()
是:
byte coder() {
return COMPACT_STRINGS ? coder : UTF16;
}
因此,它实际上是一个运行时常量,因为String
是不可变的,并且value
的长度将在编译时确定。
答案 2 :(得分:-2)