Som*_*Guy 30 java heap stack memory-management
可能重复:
字符串对象和字符串文字之间的差异
假设我有两个陈述.
String one = "abc";
String two = new String("abc");
Run Code Online (Sandbox Code Playgroud)
哪一个是堆栈内存并存储在堆中?
这两者有什么区别?
创建了多少个对象以及内存中的引用如何?
什么是最佳做法?
aio*_*obe 23
所有对象都存储在堆上(包括其属性).1
局部变量(包括参数)始终包含原始值或引用,并存储在堆栈中.1
那么,对于你的两行:
String one = "abc";
String two = new String("abc");
Run Code Online (Sandbox Code Playgroud)
堆上有两个对象(包含两个String对象"abc"),堆栈上有两个引用(每个对象一个)(提供one并且two是局部变量).
(实际上,准确地说,当涉及到诸如字符串文字之类的实习字符串时,它们存储在所谓的字符串池中.)
创建了多少个对象以及内存中的引用如何?
有趣的是,你问,因为字符串在Java语言中是特殊的.
但有一件事是保证的:无论何时使用,new你都会得到一个新的参考.这意味着,two将不会指向同一个对象one,这意味着你的代码,这两条线后,有堆两个对象.
1)从形式上讲,Java语言规范没有指定值存储在内存中的方式和位置.然而,这(或其变体)是如何在实践中完成的.
第一个被称为String Literal,在编译程序时创建,第二个是字符串对象,在运行时创建.
正如您在第二种情况下使用new关键字所以它在堆中分配.
在第一种情况下,使用称为interning的机制创建对象.当您尝试创建另一个表示相同字符序列的字符串文字时,则不会创建新的对象编译器,而是引用先前创建并存储在字符串池中的字符串
只有原始类型(int、long、...)的实例保存在堆栈中。引用类型 ( String, Integer, Long, YourTypeHere, ...) 的所有实例都保存在堆中。
更新正如评论中所指出的,对引用类型(即非原始类型——Object及其后代)实例的引用可以保存在堆栈中。这些是您的局部变量。
这不是“最佳实践”,它是 JVM 的工作方式,您无法更改它。
| 归档时间: |
|
| 查看次数: |
41187 次 |
| 最近记录: |