如果将intern()与new一起使用,会创建多少个对象?

时间:2018-08-07 14:57:31

标签: java

我了解Java中intern()的内部工作。它将开始引用字符串池区域对象。但是,当我们将inter()与new一起使用时,它是否仍在堆中创建对象,并且引用现在指向池对象?还是根本不创建任何堆对象?

String s1 = new String("hello").intern();

例如,在上一行中,当使用intern时,是否仅在字符串池中创建一个对象并对其进行引用?还是在堆中创建一个对象,在池中创建一个对象,然后开始引用池对象,从而将该对象留在堆中以进行垃圾回收?

2 个答案:

答案 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时,是否仅在字符串池中创建了一个对象并对其进行引用还是在堆中创建一个对象并在池中创建一个对象,然后开始引用池对象,从而将该对象留在堆中以进行垃圾回收?

正在大胆面对。

在此示例中,您可以看到您的代码返回了被阻止的对象。

https://ideone.com/dKFkEl

    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