Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果与new一起使用,intern()会创建多少个对象?_Java - Fatal编程技术网

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

Java 如果与new一起使用,intern()会创建多少个对象?,java,Java,我了解intern()在java中的内部工作。它将开始引用字符串池区域对象。但当我们将inter()与new一起使用时,它是否仍然在heap中创建一个对象,并且引用现在指向pool对象?或者它根本不会创建任何堆对象 String s1 = new String("hello").intern(); 例如,在上面的一行中,当使用intern时,是否只在字符串池中创建一个对象并引用它?还是在堆中创建一个对象,在池中创建一个对象,然后开始引用池对象,从而将对象留在堆中进行垃圾收集?在Oracle/O

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

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

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

在Oracle/OpenJDK中,它不创建任何对象,但是,这取决于实现

方法
intern()
返回现有对象,在本例中,返回原始的“Hi”或用于调用
intern

但当我们将inter()与new一起使用时,它是否仍然在heap中创建一个对象,并且引用现在指向pool对象

字符串文本仍在堆中。不移动任何内容以将其添加到此池

例如,在上面的一行中,当使用intern时,是否只在字符串池中创建一个对象并引用它

这只是创建一个对象,包装原始字符串文本的
char[]
byte[]
intern
将返回原始字符串文本

还是在堆中创建一个对象,在池中创建一个对象,然后开始引用池对象,从而将对象留在堆中进行垃圾收集

字符串文字池在本机内存中实现,不由对象组成

为了进行比较,调用intern()会将新字符串添加到文本池中,因为
concat
是在运行时计算的

String hi = "h".concat("i").intern();
这不起任何作用,因为
+
是在编译时计算的

String hi = ("h" + "i").intern();

如果你看一下文档,这里的引文将准确地解释发生了什么

调用intern方法时,如果池已包含 字符串等于由equals(对象)确定的此字符串对象 方法,则返回池中的字符串。否则,这个 字符串对象被添加到池中,并引用此字符串 对象返回

关于你的问题:

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

正在发生的事情是大胆的

在这里,您可以在这个演示中看到,您的代码返回了interned对象


对。字符串文本仍在堆中。那么你的意思是说它只剩下一个对象用于垃圾收集?@Deca正确,新字符串可以GC-ed。这对我来说是灰色区域。我想知道为什么java会这样做。我的意思是,它知道一旦开始在第一条语句中使用pool引用,它就知道这个对象将来永远不会被使用。为什么不能像不要自己创建对象那样呢。不管怎么说,它从一开始就表现得像文字occurance@Deca实际上,在大多数情况下,它可以通过转义分析消除对象创建。在这种情况下,JVM需要了解intern()的作用,即它何时实际使用传入的对象。这种优化可能不在JVM中,因此无论如何都会创建对象。这不是像“在Java with new中,总是在heap中创建对象”一样吗?@Deca
新字符串(“hello”)
会在heap中创建它。但是,由于您在intern()调用中使用了daisychain,因此会对池迭代heap对象以查找匹配项,然后返回该匹配项以分配给变量。然后在垃圾收集器的下一次迭代中清理堆对象,因为没有对它的引用。是的。非常感谢。在我看来也是这样。@Deca取决于程序在运行过程中的优化程度,或者如果您硬编码它,它可能会以一个简单的直接池分配结束。Java非常擅长识别这些模式,然后跳到基本步骤。为了提高效率,将硬编码的
String s1=new(“Hello”).intern()作为
String s1=StringPool.static\u引用。
    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