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

我想了解 String 类的 length 成员是否是整数常量?我想不是。


GCT1015
浏览 136回答 3
3回答

翻阅古今

它不是JLS 15.28意义上的编译时常量表达式。表达式str.length()是一个方法调用,没有显式的方法调用是常量表达式。即使 String 是文字也是如此;ie"hello".length()不是根据 JLS 的编译时常量表达式。它是一个运行时常量,从某种意义上说,一旦String被创建,长度就不能改变。这是因为 Java 字符串是不可变的。您可以通过查看(标准)String类的任何版本的源代码来确认这一点。代码可能会因版本而异,但“运行时恒定性”属性在所有版本中都将保持不变。(其实上面说的并不完全准确,如果你愿意用坏反射来破坏封装,你可以修改 a 的私有成员String并对其进行变异。这样可以改变 返回的值length()。你可以通过 native 达到同样的效果代码方法,可能还有其他方法。但是......只是......不要这样做!JLS 说如果你这样做,你的 Java 代码的行为是未指定的。)

蛊毒传说

根据源代码的(jdk9)String类,length():public int length() {    return value.length >> coder();}哪里value是@Stableprivate final byte[] value;并且coder()是:byte coder() {    return COMPACT_STRINGS ? coder : UTF16;}所以它本质上是一个运行时常量,因为String's 是不可变的,并且 的长度value将在编译时决定。

人到中年有点甜

来自 的length成员String class是一个方法,返回一个int值,表示 的字符数String。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java