首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >请解释intern()方法的功能

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

Stack Overflow用户
提问于 2013-01-18 05:59:33
回答 3查看 2K关注 0票数 4

可能重复: 我们什么时候应该使用字符串的实习生方法? 什么是弦乐实习?

请解释下列代码的内部工作方式:

代码语言:javascript
复制
System.out.println(new String("ABC").intern()==new String("ABC").intern());

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

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

如果我错了,请解释。

EN

回答 3

Stack Overflow用户

发布于 2013-01-18 07:11:38

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

tl;dr版本:--您的答案几乎是正确的-- 3,只是进入字符串池的字符串不是作为该语句的一部分生成的,而是已经创建的。

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

因此,第一个new String("ABC")创建一个String,它简单地对字符数组创建一个复制引用 (但不创建一个新对象),并从表示"ABC"文本的字符串中进行散列(同样,该字符串不是作为该行的一部分创建的)。然后,.intern()方法将查看相同字符串是否已经在permgen中。它是(它只是表示文字开始的字符串),所以这就是函数返回的内容。那么,new String("ABC").intern() == "ABC".请参阅JLS 3.10.5,特别是:

此外,字符串文字总是引用类字符串的同一个实例。这是因为字符串文本--或者更普遍地说,字符串是常量表达式的值(§15.28) --是“内部的”,以便使用String.intern方法共享唯一的实例。

同样的事情在第二次发生new String("ABC").intern()时也会发生。而且,由于两个intern()方法都返回与"ABC"文本相同的对象,所以它们表示相同的值。

把它拆开一点:

代码语言:javascript
复制
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.
票数 1
EN

Stack Overflow用户

发布于 2013-01-18 06:02:32

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-01-18 06:29:27

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14393231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档