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
Java 与字符串常量池相关的查询_Java_String_Immutability - Fatal编程技术网

Java 与字符串常量池相关的查询

Java 与字符串常量池相关的查询,java,string,immutability,Java,String,Immutability,PFB是我试图理解的一段代码 public static void main(String[] args) { String s1 = "dexter7"; String s2 = "dexter" + "7"; System.out.println(s1==s2); //line 1 - Output is true String s3 = "dexter" + s1.length(); System.out.println(s1==s3); /

PFB是我试图理解的一段代码

public static void main(String[] args) {

    String s1 = "dexter7";
    String s2 = "dexter" + "7";

    System.out.println(s1==s2); //line 1 - Output is true

    String s3 = "dexter" + s1.length();

    System.out.println(s1==s3); //line 2 - Output is false

}
根据字符串常量池的概念,如果常量池中存在字符串值,则将重复使用它,而不是创建新字符串,除非图片中有“new”关键字

那么,考虑到上面代码段中标记的第1行和第2行的输出,为什么在上面代码段中会改变这种行为呢

谁能帮我理解这一点

谢谢。

s1.length()
不是在编译时计算的,而是在运行时计算的,所以

String s3 = "dexter" + s1.length();
将被汇编成

String s3 = new StringBuilder("dexter").append(s1.length()).toString();
toString
将在内部使用
新字符串(…)
来创建
s3
,因此它不会来自字符串池


另一方面

String s2 = "dexter" + "7";
由编译器连接并编译为

String s2 = "dexter7";

因此,
s2
s1

是相同的字符串文字,因为
s1.length()
不是一个常量表达式。这个问题有很多重复项。一定要搜索它们。