为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

GCT1015 2021-11-17 10:37:54
我想了解 String 类的 length 成员是否是整数常量?我想不是。
查看完整描述

3 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

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

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


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

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


(其实上面说的并不完全准确,如果你愿意用反射来破坏封装,你可以修改 a 的私有成员String并对其进行变异。这样可以改变 返回的值length()。你可以通过 native 达到同样的效果代码方法,可能还有其他方法。但是......只是......不要这样做!JLS 说如果你这样做,你的 Java 代码的行为是未指定的。)


查看完整回答
反对 回复 2021-11-17
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

根据源代码的(jdk9)String类,length():


public int length() {

    return value.length >> coder();

}

哪里value是


@Stable

private final byte[] value;

并且coder()是:


byte coder() {

    return COMPACT_STRINGS ? coder : UTF16;

}

所以它本质上是一个运行时常量,因为String's 是不可变的,并且 的长度value将在编译时决定。


查看完整回答
反对 回复 2021-11-17
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

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


查看完整回答
反对 回复 2021-11-17
  • 3 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信