gpt4 book ai didi

java - 为什么 String.intern() 在 Oracle JDK 1.7 中表现不同?

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

这是一个java代码片段:

public class TestIntern {
public static void main(String[] argvs){
String s1 = new StringBuilder("ja").append("va").toString();
String s2 = new StringBuilder("go").append("lang").toString();
System.out.println(s1 == s1.intern());
System.out.println(s2 == s2.intern());
}
}

并且根据不同的JDK表现不同

在 Oracle JDK 1.7 中输出是:

false
true

在 OpenJDK 1.6 中输出也是:

false
true

但在 Oracle JDK 1.6 中输出是:

false
false

正如此 String#intern 方法的 JavaDoc 所示

 * When the intern method is invoked, if the pool already contains a
* string equal to this <code>String</code> object as determined by
* the {@link #equals(Object)} method, then the string from the pool is
* returned. Otherwise, this <code>String</code> object is added to the
* pool and a reference to this <code>String</code> object is returned.
~~~~
And what does *this* here mean? the string object
in the heap or in the string pool? if it returns
object in the heap the out put should be:

true
true
otherwise should *always* be:

false
false
Am I right?

输出:

true
true

应该是预料之中的,但这三个 JDK 都没有产生。以及为什么 Oracle JDK1.6 给出:

false
false

结果呢?

我认为在 OracleJDK 1.7 和 openJDK 1.6 中,字符串池中必须有一些保留 字符串,它们是什么?是否有文档指定所有保留 字符串?真的很困惑。

最佳答案

s1.intern() 是否返回 s1 或其他一些 String 对象取决于它在 interned 字符串池中找到的内容。如果池中已经有一些其他的 String 对象,intern() 将返回那个其他对象;否则它会将 s1 引用的 String 对象放入池中并返回该对象。

问题不在于不同的 Java 版本表现不同,而是在您运行测试时池恰好包含不同的东西。 Oracle JDK 1.7 和 openJDK 1.6 中的池碰巧已经包含字符串 "java" 而不是字符串 "golang" 我并不感到特别惊讶。

关于java - 为什么 String.intern() 在 Oracle JDK 1.7 中表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27812666/

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