Java 请解释intern()方法的功能

Java 请解释intern()方法的功能,java,Java,可能重复: 请解释以下代码的内部工作原理: System.out.println(new String("ABC").intern()==new String("ABC").intern()); 在上面的代码中,它打印“true”。但是根据java规则,对于新操作符,它总是创建一个新对象object.intern()方法还在字符串池中创建一个对象。所以我的问题是,在上面的代码中创建了多少个对象 据我所说,将创建3个新对象。一个进入字符串池,新操作符将创建两个匿名对象。但我不确定 如果我错了

可能重复:

请解释以下代码的内部工作原理:

System.out.println(new String("ABC").intern()==new String("ABC").intern());
在上面的代码中,它打印“true”。但是根据java规则,对于新操作符,它总是创建一个新对象
object.intern()
方法还在字符串池中创建一个对象。所以我的问题是,在上面的代码中创建了多少个对象

据我所说,将创建3个新对象。一个进入字符串池,新操作符将创建两个匿名对象。但我不确定

如果我错了,请解释。

当您调用
intern()
方法时,jvm将检查给定字符串是否在字符串池中。若它在那个里,它将返回对那个的引用,否则它将在池中创建一个新字符串并返回对那个的引用。 在您的例子中:
System.out.println(新字符串(“ABC”).intern()==新字符串(“ABC”).intern())


第一次
new String(“ABC”).intern()
将在池中创建一个字符串“ABC”。当您第二次调用
new String(“ABC”).intern()
时,jvm将返回对先前创建的字符串的引用。这就是比较这两个字符串时得到
true
的原因(btn指向相同的引用).

我相信您是对的,因为
new
操作创建了一个新对象,因此有两个匿名对象,
intern()
仅在字符串池中创建一个新字符串(如果它还没有)并返回它的引用

假设优化器中没有聪明之处,则会创建两个对象。(足够聪明的优化器可以将其优化为无条件的
true
,在这种情况下不会创建任何对象。)

tl;dr version:您对3的回答几乎是正确的,只是进入字符串池的字符串并不是作为该语句的一部分生成的;它已经创建了

首先,让我们把
“ABC”
文字放在一边。它在运行时表示为
String
对象,但它存在于pergen中,并且在JVM的整个生命周期中创建一次。如果这是第一个使用该字符串文字的类,则它是在类加载时创建的(请参阅,其中说明该字符串是在类加载时创建的,除非它以前存在)

因此,第一个
新字符串(“ABC”)
创建一个
字符串
,它只是(但不创建新对象)到chars数组,并从表示
“ABC”
文本的字符串散列(同样,它不是作为此行的一部分创建的)。然后,
.intern()
方法查看permgen中是否已经存在相等的字符串。它是(它只是表示要开始的文本的字符串),所以这就是该函数返回的内容。因此,
newstring(“ABC”).intern()==“ABC”
。具体见:

此外,字符串文字总是引用类字符串的同一实例。这是因为字符串文字(或者更一般地说,是常量表达式(§15.28)的值的字符串)被“插入”,以便使用string.intern方法共享唯一实例

第二次出现的
新字符串(“ABC”).intern()
也会发生同样的情况。而且,由于这两个
intern()
方法都返回与
“ABC”
文本相同的对象,因此它们表示相同的值

把它分解一下:

String a = new String("ABC"); // a != "ABC"
String aInterned = a.intern(); // aInterned == "ABC"

String b = new String("ABC"); // b != "ABC"
String bInterned = b.intern(); // bInterned == "ABC"

System.out.println(new String("ABC").intern()==new String("ABC").intern());
                                            // ... is equivalent to... 
System.out.println(aInterned == bInterned); // ...which is equivalent to...
System.out.println("ABC" == "ABC");         // ...which is always true.

我认为他的问题是“创建了多少个对象?”而不是为什么它返回trueYou是对的。将创建三个对象(在字符串中,仅当池没有ABC字符串时才会创建新字符串)以及一些相关信息:一个简短的示例是
System.out.println(“ABC”==新字符串(“ABC”).intern()