我了解Java中intern()的内部工作。它将开始引用字符串池区域对象。但是,当我们将inter()与new一起使用时,它是否仍在堆中创建对象,并且引用现在指向池对象?还是根本不创建任何堆对象?
String s1 = new String("hello").intern();
例如,在上一行中,当使用intern时,是否仅在字符串池中创建一个对象并对其进行引用?还是在堆中创建一个对象,在池中创建一个对象,然后开始引用池对象,从而将该对象留在堆中以进行垃圾回收?
答案 0 :(得分:0)
在Oracle / OpenJDK中,它不会创建任何对象,但这取决于实现。
方法intern()
返回现有对象(在这种情况下为原始的“ Hi”)或用于调用intern
的字符串
但是当我们将inter()与new一起使用时,它是否仍在堆中创建一个对象,并且引用现在指向池对象?
字符串文字仍然在堆中。没有任何动作可将其添加到该池中
例如,在上一行中,当使用intern时,它是否仅在字符串池中创建一个对象并对其进行引用?
这仅创建一个对象,将原始String文字的char[]
或byte[]
包装起来。 intern
将返回原始字符串文字。
还是在堆中创建一个对象并在池中创建一个对象,然后开始引用池对象,从而将该对象留在堆中以进行垃圾收集?
字符串文字池在本机内存中实现,不是由对象组成。
为了进行比较,对intern()的调用将在运行时计算concat
时将新字符串添加到文字池中。
String hi = "h".concat("i").intern();
这无济于事,因为+
是在编译时计算的。
String hi = ("h" + "i").intern();
答案 1 :(得分:0)
如果您查看文档,此处的引用将准确解释发生的情况。
https://docs.oracle.com/javase/9/docs/api/java/lang/String.html#intern--
调用intern方法时,如果池中已经包含一个 等于由equals(Object)确定的此String对象的字符串 方法,然后返回池中的字符串。不然这样 将String对象添加到池中,并对此String进行引用 对象被返回。
关于您的问题:
例如在上一行中,当使用intern时,是否仅在字符串池中创建了一个对象并对其进行引用?
还是在堆中创建一个对象并在池中创建一个对象,然后开始引用池对象,从而将该对象留在堆中以进行垃圾回收?
正在大胆面对。
在此示例中,您可以看到您的代码返回了被阻止的对象。
String s1 = new String("hello").intern();
String s2 = new String("hello");
String s3 = "hello";
System.out.println("s1 == s2 = "+(s1 == s2));// false
System.out.println("s1 == s3 = "+(s1 == s3));// true
System.out.println("s2 == s3 = "+(s2 == s3));// false