可能是重复问题:
String对象和字符串字面值之间的区别
假设我有两个语句:
String one = "abc";
String two = new String("abc");
哪个是栈内存,哪个是堆内存?
它们的区别是什么?
有多少对象被创建以及在内存中如何引用?
最佳实践是什么?
可能是重复问题:
String对象和字符串字面值之间的区别
假设我有两个语句:
String one = "abc";
String two = new String("abc");
哪个是栈内存,哪个是堆内存?
它们的区别是什么?
有多少对象被创建以及在内存中如何引用?
最佳实践是什么?
所有对象都存储在堆上(包括它们字段的值)。1
局部变量(包括参数)始终包含原始值或引用,并存储在堆栈上。1
因此,对于您的两行代码:
String one = "abc";
String two = new String("abc");
如果one
和two
是局部变量,那么在堆上会有两个对象(包含"abc"
的两个String对象),同时在栈上会有两个引用,每个对象都有一个引用。
实际上,对于像字符串字面量这样的池化字符串,它们存储在所谓的字符串池中。
创建了多少个对象,以及在内存中引用是如何处理的?
有趣的是你问了这个问题,因为在Java语言中,String是特殊的。
但有一件事是可以保证的:每当你使用new
时,你确实会获得一个新的引用。这意味着two
将不会引用与one
相同的对象,这意味着在那两行代码后,你将在堆上拥有两个对象。
1) 严格来说,Java语言规范没有指定值在内存中的存储方式或位置。然而,在实践中,通常是这样做的。
String
,Integer
,Long
,YourTypeHere
,...) 都保存在堆上。
更新:如评论所指出,对于引用类型 (即非原始类型 - Object
及其子类) 的实例引用可以保存在堆栈上。这些是您的本地变量。String a
中的a
)的值很可能存储在堆栈上。但是它所指向的对象存储在堆上。 - aioobe