请解释intern()方法的功能

时间:2013-01-18 05:59:34

标签: java

  

可能重复:
  When should we use intern method of String?
  what is string interning?

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

System.out.println(new String("ABC").intern()==new String("ABC").intern());

在上面的代码中,它打印“true”。但根据java规则,在new运算符的情况下,它总是创建一个新对象。 object.intern()方法还在字符串池中创建一个对象。所以我的问题是,在上面的代码中创建了多少个对象。

据我所知,将创建3个新对象。一个是字符串池,新运算符将创建两个匿名对象。但我不确定。

如果我错了请解释。

3 个答案:

答案 0 :(得分:1)

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

tl; dr version:除了进入字符串池的字符串不是作为此语句的一部分生成之外,你的答案是3几乎是正确的。它已经创建了。

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

因此,第一个new String("ABC")创建一个String,它只是copies the reference(但不创建新对象)到chars数组,并且来自表示{{的String的哈希值1}} literal(再次,不是作为此行的一部分创建的)。然后"ABC"方法查看permgen中是否已存在相等的String。它是(它只是表示文字开头的字符串),所以这就是该函数返回的内容。所以,.intern()。请参阅JLS 3.10.5,特别是:

  

此外,字符串文字始终引用类String的相同实例。这是因为字符串文字 - 或者更常见的是作为常量表达式(第15.28节)的值的字符串 - 被“实例化”以便使用String.intern方法共享唯一实例。

第二次出现new String("ABC").intern() == "ABC"时确实发生了同样的事情。并且,由于new String("ABC").intern()方法都返回与intern()文字相同的对象,因此它们代表相同的值。

稍微分解一下:

"ABC"

答案 1 :(得分:0)

当你调用intern()方法时,jvm将检查字符串池中是否存在给定的字符串。如果它在那里,它将返回对它的引用,否则它将在池中创建一个新字符串并返回对它的引用。 在您的情况下:System.out.println(new String("ABC").intern()==new String("ABC").intern());

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

答案 2 :(得分:0)

我相信你是对的,因为new操作创建一个新对象,所以有2个匿名对象,intern()只在字符串池中创建一个新字符串,如果它还没有并返回它&# 39;参考