字符串文本是否存储在堆栈上?堆栈上是否存储了新的字符串?

可能的重复:
字符串对象和字符串文本之间的差异

假设我有两个语句。

String one = "abc";
String two = new String("abc");

哪一个是堆栈内存,哪个存储在堆中?

这两者之间有什么区别?

创建了多少个对象,引用在内存中如何?

最佳实践是什么?


答案 1

所有对象都存储在堆中(包括其字段的值)。1 个

局部变量(包括参数)始终包含基元值或引用,并存储在堆栈上。1 个

所以,对于你的两行:

String one = "abc";
String two = new String("abc");

堆上有两个对象(两个包含 String 对象)和两个引用,每个对象一个,在堆栈上(提供并且是局部变量)。"abc"onetwo

(实际上,确切地说,当涉及到诸如字符串文本之类的滞留字符串时,它们存储在所谓的字符串池中。

创建了多少个对象,引用在内存中如何?

你问这个问题很有趣,因为字符串在Java语言中是特殊的。

但是,有一件事是可以保证的:每当您使用时,您确实会得到一个新的参考。这意味着不会引用同一个对象,因为这意味着在这两行代码之后,堆上将有两个对象。newtwoone


1)正式地说,Java语言规范没有指定值在内存中的存储方式或位置。然而,这(或其变体)是在实践中通常如何完成的。


答案 2

第一个称为字符串文本,并在编译程序时创建,第二个是字符串对象,并在运行时创建。

由于您在第二种情况下使用了new关键字,因此它在堆中分配。

在第一种情况下,对象是使用称为“实习”的机制创建的。当您尝试创建另一个表示相同字符序列的字符串文本时,则不会创建新的对象编译器,而是引用在字符串池中创建和存储的上一个字符串


推荐