gpt4 book ai didi

java - 关于 java String 文字池和 String 拼接的困惑

转载 作者:搜寻专家 更新时间:2023-10-31 19:47:19 25 4
gpt4 key购买 nike

全部,我在编写下面的代码时遇到了问题

String hello = "Hello";
String str5 = "Hel" + "lo";
String str8 = "Hel";
String str9 = "lo";
String str10 = str8 + str9;
System.out.println("str10==hello?" + (str10 == hello));
System.out.println("str5==hello?" + (str5 == hello));
System.out.println("str10==str5?" + (str10 == str5));

然后我运行我的代码,控制台打印这个

str10 == hello ? false
str5 == hello ? true
str10 == str5 ? false

这让我很困惑。为什么第二次打印 TRUE 但第一次打印 FALSE?在我对字符串文字池的理解中,当定义了一个字符串时,JVM 将检查池中是否包含该字符串,如果没有,则将字符串放入池中。
在我的代码中,变量hello存在于字符串池中,“Helo”和“lo”也在池中,我的问题是

  1. 如果池中存在“Helo”和“lo”的串联结果。
  2. 关于str5和str10s'的定义有什么区别,为什么它们不是“==”? str5和str10是指字符串池中不同的“Hello”吗?(“==”好像指的是同一个对象)

我的jdk版本:1.6.0_29
我的IDE:Intellij Idea 11.2

谁能指出来?非常感谢

最佳答案

它的行为是应该的。它在 JLS 的两个部分中得到解决。

JLS #3.10.5 :

strings that are the values of constant expressions (§15.28) - are "interned" so as to share unique instances, using the method String.intern.

JLS #15.28列出什么被视为常量表达式。特别是,字符串文字是常量表达式(“Hel”和“lo”),但要将变量视为常量,它必须是最终的。

在您的情况下,如果您稍微更改代码以使 str8str9 保持不变,您将获得 true 三次:

final String str8 = "Hel";
final String str9 = "lo";

关于java - 关于 java String 文字池和 String 拼接的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15427599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com