可能重复: 我们什么时候应该使用字符串的实习生方法? 什么是弦乐实习?
请解释下列代码的内部工作方式:
System.out.println(new String("ABC").intern()==new String("ABC").intern());在上面的代码中,它打印"true“。但是根据java规则,对于新操作符,它总是创建一个新对象。object.intern()方法还会在字符串池中创建一个对象。所以我的问题是,在上面的代码中,创建了多少个对象。
据我所知,将创建3个新的对象。其中一个进入字符串池,新操作符将创建两个匿名对象。但我不确定。
如果我错了,请解释。
发布于 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"文本相同的对象,所以它们表示相同的值。
把它拆开一点:
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.发布于 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指向相同的引用)。
发布于 2013-01-18 06:29:27
我相信您是对的,因为new操作创建了一个新对象,因此有2个匿名对象,intern()只在字符串池中创建一个新字符串,并且返回它的引用
https://stackoverflow.com/questions/14393231
复制相似问题