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

字符串常量池

字符串常量池

红糖糍粑 2019-12-02 04:04:54
字符串常量池由于这些问题#1说明:问题1和问题2我的理解是“ 字符串常量 ”被拘留时:String s = "abc";在以下情况下,JVM将创建一个新的String对象,而不是使用String Pool中的现有对象:String s = new String("abc");但是,在阅读以下两个类似的陈述后,我有一个疑问。来自SCJP准备书:当编译器遇到String文本时,它会检查池以查看是否已存在相同的String。如果找到匹配项,则对新文本的引用将定向到现有String,并且不会创建新的String文本对象。来自JavaRanch:在这种情况下,由于关键字“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运算符时跳过?
查看完整描述

3 回答

?
慕雪6442864

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

也许这有助于您理解:

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"从未发生过。



查看完整回答
反对 回复 2019-12-03
?
蓝山帝景

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

 //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 !!!



查看完整回答
反对 回复 2019-12-03
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

你的问题 :


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


Ans:使用new关键字创建新的字符串对象时,生成的地址将是堆地址,而不是字符串常量池地址。两个地址都不同。


问题:


String one = new String("test");

String two = "test";


System.out.println(one.equals(two)); // true

System.out.println(one == two);      // false

以前的语句是否意味着它们将被放入池内存中,但在使用new运算符时会被跳过?


答:是的,您的假设是正确的。当程序员使用new关键字时,JVM将忽略关于字符串常量池,并在Heap中创建一个新副本。因此两个地址都不相同。



查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 225 浏览

添加回答

举报

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