字符串常量池

字符串常量池

由于这些问题#1说明:问题1和问题2我的理解是“ 字符串常量 ”被拘留时:

String s = "abc";

在以下情况下,JVM将创建一个新的String对象,而不是使用String Pool中的现有对象:

String s = new String("abc");

但是,在阅读以下两个类似的陈述后,我有一个疑问。

当编译器遇到String文本时,它会检查池以查看是否已存在相同的String。如果找到匹配项,则对新文本的引用将定向到现有String,并且不会创建新的String文本对象。

在这种情况下,由于关键字“new”,我们实际上最终会遇到略微不同的行为。在这种情况下,对字符串文字的引用仍然放在常量表(String Literal Pool)中,但是,当你来到关键字“new”时,JVM必须在运行时创建一个新的String对象,而不是使用常量表中的那个。

因此,当我们使用“new”并基于上面的定义创建对象时,我们还在非池内存和池内存中放置引用。当我们这样做时,JVM是否也应该返回相同的引用?:

String one = new String("test");String two = "test";System.out.println(one.equals(two)); // trueSystem.out.println(one == two);      // false

因为在声明字符串文字时String three = "test";它会存在于池中吗?因此应该返回相同的参考和打印真实?或者之前的陈述是否意味着它们将被放入池内存中,但只是在使用new运算符时跳过?



红糖糍粑
浏览 226回答 3
3回答

慕雪6442864

也许这有助于您理解:String literal = "test";String one = new String(literal);String two = "test";System.out.println(literal == two); //trueSystem.out.println(one == two); //false在您发布的示例中:String one = new String("test");String two = "test";由于实习,传递给构造函数的引用与引用String(String)具有相同的值two。但是,字符串本身(由这两个引用引用)用于构造分配给引用的新对象one。在这个例子中,正好有两个String用值“test”创建:一个在常量池中维护并"test"在表达式中使用文字时引用,第二个由“new”运算符创建并分配给参考one。编辑也许你对这句话感到困惑:当编译器遇到String文本时,它会检查池以查看是否已存在相同的String。请注意,这可能更明确地说明如下:当编译器遇到String文本时,它会检查池中是否已存在相同的String 。字符串只有在明确地实现或通过类使用文字时才放入池中。例如,如果你有这种情况:String te = "te";String st = "st";String test = new String(te) + new String(st);然后当一个String将存在该值时test,表示字符串将不存在于池中,因为文字"test"从未发生过。

蓝山帝景

 //Creates a new object even if one exists in the pool     String s1 = new String("Tendulkar");     // makes a new object string and then the reference is available to the pool     String s2 = s1.intern();     //this object is not created but references the address present in the pool     String s3 = "Tendulkar";     System.out.print(s1==s2); // results in false     System.out.print(s2==s3); //very very true !!!

拉风的咖菲猫

你的问题 :因此,当我们使用“new”并基于上面的定义创建对象时,我们还在非池内存和池内存中放置引用。当我们这样做时,JVM是否也应该返回相同的引用?:Ans:使用new关键字创建新的字符串对象时,生成的地址将是堆地址,而不是字符串常量池地址。两个地址都不同。问题:String one = new String("test");String two = "test";System.out.println(one.equals(two)); // trueSystem.out.println(one == two);      // false以前的语句是否意味着它们将被放入池内存中,但在使用new运算符时会被跳过?答:是的,您的假设是正确的。当程序员使用new关键字时,JVM将忽略关于字符串常量池,并在Heap中创建一个新副本。因此两个地址都不相同。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java