gpt4 book ai didi

java - intern() 在 Java 6 和 Java 7 中的行为不同

转载 作者:IT老高 更新时间:2023-10-28 20:26:58 28 4
gpt4 key购买 nike

class Test {
public static void main(String...args) {
String s1 = "Good";
s1 = s1 + "morning";
System.out.println(s1.intern());
String s2 = "Goodmorning";
if (s1 == s2) {
System.out.println("both are equal");
}
}
}

此代码在 Java 6 和 Java 7 中产生不同的输出。在 Java 6 中,s1==s2 条件返回 false,而在 Java 7 中,s1==s2 返回 true .为什么?

为什么这个程序在 Java 6 和 Java 7 中产生不同的输出?

最佳答案

看来JDK7处理实习生的方式和以前不一样了。
我使用 build 1.7.0-b147 对其进行了测试并得到“两者相等”,但是当使用 1,6.0_24 执行它(相同的字节码)时,我没有收到消息。
它还取决于 String b2 =... 行在源代码中的位置。以下代码也不输出消息:

class Test {
public static void main(String... args) {
String s1 = "Good";
s1 = s1 + "morning";

String s2 = "Goodmorning";
System.out.println(s1.intern()); //just changed here s1.intern() and the if condition runs true

if(s1 == s2) {
System.out.println("both are equal");
} //now it works.
}
}

似乎 intern 在其字符串池中找不到字符串后,将实际实例 s1 插入池中。创建 s2 时 JVM 正在使用该池,因此它得到与 s1 相同的引用。另一方面,如果先创建 s2,则该引用将存储到池中。
这可能是从 Java 堆的永久生成中移出实习字符串的结果。

在这里找到:Important RFEs Addressed in JDK 7

In JDK 7, interned strings are no longer allocated in the permanent generation of the Java heap, but are instead allocated in the main part of the Java heap (known as the young and old generations), along with the other objects created by the application. This change will result in more data residing in the main Java heap, and less data in the permanent generation, and thus may require heap sizes to be adjusted. Most applications will see only relatively small differences in heap usage due to this change, but larger applications that load many classes or make heavy use of the String.intern() method will see more significant differences.

不确定这是否是错误以及来自哪个版本... JLS 3.10.5 状态

The result of explicitly interning a computed string is the same string as any pre-existing literal string with the same contents.

所以问题是如何解释预先存在的,编译时或执行时:“早安”是否预先存在?
我更喜欢它在 7 之前实现的方式......

关于java - intern() 在 Java 6 和 Java 7 中的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7065337/

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