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()代码>