Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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/4/string/5.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_String Literals - Fatal编程技术网

在编译时或运行时用java创建字符串池是什么时候?

在编译时或运行时用java创建字符串池是什么时候?,java,string,string-literals,Java,String,String Literals,我知道,当池中已经存在一个字符串时,就不会再生成新的字符串文本 我也知道字符串常量池和堆之间的区别 我只想知道下面这个例子中的一个类的字符串池是什么时候创建的 String s="qwerty"; String s1="qwer"+"ty";// this will be resolved at compile time and no new string literal will be made String s2=s.subString(1); will create qwerty at

我知道,当池中已经存在一个字符串时,就不会再生成新的字符串文本

我也知道字符串常量池和堆之间的区别

我只想知道下面这个例子中的一个类的字符串池是什么时候创建的

String s="qwerty";
String s1="qwer"+"ty";// this will be resolved at compile time and no new string literal will be made

String s2=s.subString(1); will create qwerty at run time

s==s1; //true
s==s2;//false

我想知道字符串s1在编译时解析是否意味着字符串池是在编译时创建的???

常量池包含
String
实例,它们是运行时工件。显然,在启动使用对象的程序之前,不能创建对象。指定将创建哪些字符串常量的数据在编译时准备好,并且是类文件格式的一部分

但是,请注意,字符串常量是在类加载时创建的,而不是在类初始化时或首次使用时创建的。这是人们经常混淆的一点

在您的示例中,差异不在编译时和运行时之间,而是在常量池中创建一次字符串和每次执行一行代码时创建字符串之间

还请注意,字符串池在OpenJDK中很长一段时间以来一直是常规堆的一部分(甚至在它成为OpenJDK之前)。

根据您的代码:

String s2=s.subString(1); //this will create werty not qwerty so s==s2 will be anyways false
如果你使用

String s2=s.subString(0); //this will create qwerty 
然后
s==s2
将返回
true

还有一个方法
intern()

String s2 = new String("Qwerty").intern();
在这种情况下,
s==s2
将返回
true
但是如果
strings2==新字符串(“Qwerty”)
然后
s==s2
将返回
false


在JDK 7之前,字符串文字也是permgen空间的一部分,之后它们成为堆空间的一部分。

当我们说“在编译时解析”时,我们的意思是:检查是否已经声明了一个名为
s1
的字符串类型变量。这是由编译器检查的,但与常量池没有任何关系。@LuigidelCarno OP在这里表示串联表达式被解析为编译时常量表达式,并将被视为字符串文字。@Marko Topolnik感谢您的回答,并提醒我字符串池是堆的一部分,我知道对象是在运行时生成的,但我想知道为什么说两个字符串文字的串联发生在编译时(string s1=“qwer”+“ty”)@anubhav。因为编译器知道字符串文本。也因为它是在规范中指定的。@anubhav的关键概念是。