【问题标题】:String reference?字符串参考?
【发布时间】:2025-11-26 03:55:02
【问题描述】:

我们制作以下 String 对象?

String str1 = new String("ABC");
String str2 = new String("ABC");
String str3 = "ABC";
String str4 = "ABC";

上面两个问题:

  1. system.out.println("valof str1 "+str1 ); -- 将 str1 打印为 ABC 但是当我们比较if(str1==str2)时,它比较的是字符串对象的引用。如何 jvm 有什么不同?

  2. str1str2str3 的引用不同,但 str3str4 具有相同的引用,因此 jvm 会检查我们要使用相等运算符创建的字符串是否(而不是 new ) 已经存在(如果它存在,它不会创建新对象,只需将相同的引用分配给新变量,即str4),但它不会在新运算符的情况下进行此验证?

【问题讨论】:

    标签: java string


    【解决方案1】:

    在 Java 中,字符串文字(裸 "ABC" 而不是 new String("ABC"))是interned。也就是说,JVM 中只存储了一个副本,并且始终是使用的副本。这就是为什么它们在使用 == 时比较相等的原因。

    以下比较也总是正确的:

    str1.intern() == str2.intern()
    str1.intern() == str3
    str2.intern() == str3
    str1.intern() == str4
    str2.intern() == str4
    

    【讨论】:

    • 仅供参考,您可以调用 s.intern() 来实习任何字符串。
    • @Spike:确实,我更新了我的答案来证明这一点。 (无论如何,我一开始就打算把它放进去,但是因为我想在“西部最快的枪”中获得第一个帖子——我通常会发布一些基本的东西,然后在 5 分钟的宽限期内将其扩展期间。)
    • 感谢克里斯提供有见地的解释。但是我对您的解释有以下疑问:- 1) 如果我们创建了 str1=new String("ABC")// 它直到现在才添加到池中。正确吗?但是当我们执行 str1.intern() 时,它会在池中添加 str1 我的 point1 仍然没有答案,即当我们执行 if(str1==str2) 时,它会比较引用,但在 sys 中打印 str1 时,它实际上会打印值?跨度>
    • @Mohit:字符串不需要被打印出来!如果您想使用== 进行比较,则只需要对其进行实习。否则,是否实习字符串没有区别。
    • @berry120 恭喜您在最近的一个问题上获得 56 次支持。 ;-)
    【解决方案2】:

    当您调用new String(...) 时,您正在显式创建新字符串并要求不同的引用。如果你想回到一个单一的参考,你可以打电话:

    str1 = str1.intern();
    

    【讨论】: