字符串文本是否存储在堆栈上?堆栈上是否存储了新的字符串?
2022-09-01 11:53:58
可能的重复:
字符串对象和字符串文本之间的差异
假设我有两个语句。
String one = "abc";
String two = new String("abc");
哪一个是堆栈内存,哪个存储在堆中?
这两者之间有什么区别?
创建了多少个对象,引用在内存中如何?
最佳实践是什么?
可能的重复:
字符串对象和字符串文本之间的差异
假设我有两个语句。
String one = "abc";
String two = new String("abc");
哪一个是堆栈内存,哪个存储在堆中?
这两者之间有什么区别?
创建了多少个对象,引用在内存中如何?
最佳实践是什么?
所有对象都存储在堆中(包括其字段的值)。1 个
局部变量(包括参数)始终包含基元值或引用,并存储在堆栈上。1 个
所以,对于你的两行:
String one = "abc";
String two = new String("abc");
堆上有两个对象(两个包含 String 对象)和两个引用,每个对象一个,在堆栈上(提供并且是局部变量)。"abc"
one
two
(实际上,确切地说,当涉及到诸如字符串文本之类的滞留字符串时,它们存储在所谓的字符串池中。
创建了多少个对象,引用在内存中如何?
你问这个问题很有趣,因为字符串在Java语言中是特殊的。
但是,有一件事是可以保证的:每当您使用时,您确实会得到一个新的参考。这意味着不会引用同一个对象,因为这意味着在这两行代码之后,堆上将有两个对象。new
two
one
1)正式地说,Java语言规范没有指定值在内存中的存储方式或位置。然而,这(或其变体)是在实践中通常如何完成的。
第一个称为字符串文本,并在编译程序时创建,第二个是字符串对象,并在运行时创建。
由于您在第二种情况下使用了new关键字,因此它在堆中分配。
在第一种情况下,对象是使用称为“实习”的机制创建的。当您尝试创建另一个表示相同字符序列的字符串文本时,则不会创建新的对象编译器,而是引用在字符串池中创建和存储的上一个字符串