String类的length成员是整数常量吗?

时间:2018-10-14 00:44:48

标签: java

我试图了解String类中的length成员是否为整数常量?我以为不是。

3 个答案:

答案 0 :(得分:6)

它不是JLS 15.28意义上的编译时间常数表达式

表达式str.length()是一个方法调用,没有明确的方法调用是常量表达式。即使String是文字,也是如此;也就是说,根据JLS,"hello".length()不是编译时常数表达式。


它是一个运行时常量,从某种意义上说,一旦创建String,长度就不能更改。这是因为Java字符串是不可变的。

您可以通过查看(标准)String类的任何版本的源代码来确认这一点。该代码在不同版本之间可能会有所不同,但是“运行时稳定性”属性在所有版本中都将保持不变。


(实际上,以上内容并不完全正确。如果您愿意使用 bad 反射来破坏封装,则可以修改String的私有成员并进行变异它可以更改length()返回的值,您可以通过本机代码方法和可能的其他方法来达到相同的效果,但是……只是……不要这样做!您做这种事情,您的Java代码的行为是未指定。)

答案 1 :(得分:4)

根据Stringsource codelength()(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)

来自String class

length成员是一种方法,返回一个int值,表示String的字符数。