堆和栈的探讨以及从创建对象层面来优化程序的常识
2015-03-24 17:13
561 查看
知乎上有一个问题,是讨论堆和栈的区别的(http://www.zhihu.com/question/29005517)。只有大牛赵劼引用了一篇英文文献作答。大雾。在CSDN上看了几篇,有所了解。比如这篇:java中堆和堆栈的区别,有理有据,令人信服。
栈(stack):是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量.
在java中,所有基本类型和引用类型都在栈中存储.栈中数据的生存空间一般在当前scopes内(就是由{...}括起来的区域).
堆(heap):是一个可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护),C中的malloc语句所产生的内存空间就在堆中.
在java中,所有使用new xxx()构造出来的对象都在堆中存储,当垃圾回收器检测到某对象未被引用,则自动销毁该对象.所以,理论上说java中对象的生存空间是没有限制的,只要有引用类型指向它,则它就可以在任意地方被使用。
另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。
栈(stack):是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量.
在java中,所有基本类型和引用类型都在栈中存储.栈中数据的生存空间一般在当前scopes内(就是由{...}括起来的区域).
堆(heap):是一个可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护),C中的malloc语句所产生的内存空间就在堆中.
在java中,所有使用new xxx()构造出来的对象都在堆中存储,当垃圾回收器检测到某对象未被引用,则自动销毁该对象.所以,理论上说java中对象的生存空间是没有限制的,只要有引用类型指向它,则它就可以在任意地方被使用。
另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。
相关文章推荐
- javascript笔记:深入分析javascript里对象的创建(下)---从对象创建到javascript程序优化
- javascript笔记:深入分析javascript里对象的创建(下)---从对象创建到javascript程序优化
- javascript笔记:深入分析javascript里对象的创建(下)---从对象创建到javascript程序优化
- 深入研究java对String字符串对象的创建以及管理
- 用ResultSet对象创建XML文件的通用程序
- 关于DELPHI中的类对象以及类指针简单探讨总结。
- Windows程序中的相对路径以及创建文件夹
- 在VB程序中用ADO对象动态创建数据库和表
- 深入研究java对String字符串对象的创建以及管理
- 对session对象在web开发中的创建以及sessionId生成并返回客户端的运行机制.
- 批处理实现c/s程序部署,以及创建桌面快捷方式
- 深入研究java对String字符串对象的创建以及管理
- effective-java学习笔记(2)避免在程序中创建重复的对象
- 深入研究java对String字符串对象的创建以及管理
- 深入研究java对String字符串对象的创建以及管理【转帖】
- 深入研究java对String字符串对象的创建以及管理
- 用ResultSet对象创建xml文件的通用程序
- 用ResultSet对象创建xml文件的通用程序
- 如何获取某个进程的主窗口以及创建进程的程序名?
- (原创)深入研究java对String字符串对象的创建以及管理