Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串类的长度成员是整数常量吗?_Java - Fatal编程技术网

Java 字符串类的长度成员是整数常量吗?

Java 字符串类的长度成员是整数常量吗?,java,Java,我试图理解String类中的长度成员是否为整数常量?我认为它不是。从某种意义上讲,它不是编译时常量表达式 表达式str.length是一个方法调用,没有显式方法调用是常量表达式。即使字符串是文本,这也是正确的;i、 根据JLS,hello.length不是编译时常量表达式 它是一个运行时常量,即一旦创建字符串,长度就不能更改。这是因为Java字符串是不可变的 您可以通过查看标准字符串类的任何版本的源代码来确认这一点。代码可能在不同版本之间有所不同,但运行时恒定性属性在所有版本中保持不变 事实上,

我试图理解String类中的长度成员是否为整数常量?我认为它不是。

从某种意义上讲,它不是编译时常量表达式

表达式str.length是一个方法调用,没有显式方法调用是常量表达式。即使字符串是文本,这也是正确的;i、 根据JLS,hello.length不是编译时常量表达式

它是一个运行时常量,即一旦创建字符串,长度就不能更改。这是因为Java字符串是不可变的

您可以通过查看标准字符串类的任何版本的源代码来确认这一点。代码可能在不同版本之间有所不同,但运行时恒定性属性在所有版本中保持不变

事实上,上述说法并不完全准确。如果您愿意使用坏反射来破坏封装,那么可以修改字符串的私有成员并对其进行变异。它可以更改由长度返回的值。您可以通过本机代码方法以及其他可能的方法实现相同的效果。但是只是别这样!JLS表示,如果您执行这种操作,Java代码的行为是未指定的。

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

根据String类的jdk9:

价值何在

编码者是:


因此,它本质上是一个运行时常量,因为字符串是不可变的,值的长度将在编译时决定。

恐怕我不清楚您在问什么?length返回一个int原语,String类在Java中是不可变的,但返回的int值本身不是常量。您可以检查源代码。因为字符串是不可变的,所以它很可能是最终的。!在&&之前执行。你有考试吗?你可以很容易地测试这些东西。布尔值a=真,b=假;System.out.println!b&a?否定是第一位的:连词是第一位的;//美国first@LajosArpad-在教科书、Oracle Java教程或JLS中查找它是测试it方法的更好方法。新手很容易根据错误的测试结果得出错误的想法。有各种令人惊讶的边缘情况很难通过无向测试发现。由于字符串的源代码随着时间的推移发生了变化,您应该编辑答案并澄清这是哪一版本的Java。@Andreas这是一个很好的建议。Edited虽然这是一个事实上真实的语句,很容易从javadoc中获得,但它无论如何都不能回答这个问题。@Andreas问题是关于长度是多少。我认为我的答案是正确的。
public int length() {
    return value.length >> coder();
}
@Stable
private final byte[] value;
byte coder() {
    return COMPACT_STRINGS ? coder : UTF16;
}