首页 > 解决方案 > 如果与 new 一起使用,intern() 会创建多少个对象?

问题描述

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

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

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

标签: java

解决方案


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

该方法intern()要么返回现有对象,在这种情况下,原始“Hi”或用于调用的字符串intern

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

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

比如上一行,当使用intern时,是不是只在字符串池中创建一个对象并引用它?

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

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

字符串字面量池是在本机内存中实现的,不是由对象组成的。

为了比较,这个对 intern() 的调用将新字符串添加到concat在运行时计算的文字池中。

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

这没有任何作用,因为+是在编译时计算的。

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

推荐阅读