可能重复:
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个新对象。一个是字符串池,新运算符将创建两个匿名对象。但我不确定。
如果我错了请解释。
答案 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;参考