Java 字符串常量池的自引用

Java 字符串常量池的自引用,java,string,Java,String,我了解到字符串常量池在链接中也是自引用的,它被写为字符串文本的创建: String s= "new"; 将在堆中创建一个新字符串“new”(如果没有)。 那么,这是否意味着无论对象是文本对象还是使用new关键字的新对象,都始终在堆中创建对象 我对intern的理解是——它检查堆中是否有同名的对象,然后引用它,否则在堆中创建新对象。 如果我错了,请纠正 我还有一个疑问——常量池是包含对象,还是只包含对堆中对象的引用 这是否意味着无论对象是文本对象还是使用new关键字的新对象,都始终在堆中创建对象

我了解到字符串常量池在链接中也是自引用的,它被写为字符串文本的创建:

String s= "new";
将在堆中创建一个新字符串“new”(如果没有)。 那么,这是否意味着无论对象是文本对象还是使用new关键字的新对象,都始终在堆中创建对象

我对intern的理解是——它检查堆中是否有同名的对象,然后引用它,否则在堆中创建新对象。 如果我错了,请纠正

我还有一个疑问——常量池是包含对象,还是只包含对堆中对象的引用

这是否意味着无论对象是文本对象还是使用new关键字的新对象,都始终在堆中创建对象

是的,在Java中,所有
对象
-派生对象,包括
字符串
都是在堆中创建的。唯一的区别是常量池中相同的
String
对象在编译器的帮助下得到重用,而使用操作符
new
创建的
String
对象需要程序员提供明确的代码才能得到重用。

是的,它在堆上。


关于intern()


你是对的。

你链接到的问题不是已经回答了你的问题吗?是的,但是这个链接还说,在使用new创建对象时,也会检查名称中是否有具有相同值的对象,我相信这不是因为new总是在堆中创建新对象。所以我只想确保我所理解的是正确的。kk得到了…常量池是包含对象还是仅包含对堆中对象的引用。@jayendrabhatt所有对象,包括池本身,都在堆中。Java允许嵌入标量原语值,但一旦进入数组或其他对象,你所得到的只是一个引用+堆中的一个对象。我不太确定文字池是否是堆的一部分,因为这表明它不是,但正如你所说,池将只包含一个引用和堆中的对应对象。@jayendrabhatt这篇文章的作者区分了使用
new
创建的堆对象作为“永久生成”成员的对象,他不称之为堆对象。这可能有助于讨论Java内存管理,但它不会使permgen对象与堆对象有任何不同。此外,显然Java-8完全消除了permgen。