java堆、栈、堆栈,常量池的区别,史上最全总结
发布网友
发布时间:2024-08-20 16:40
我来回答
共1个回答
热心网友
时间:2024-08-23 00:58
栈和堆栈,老一辈程序员常说的堆栈,实际上是栈的意思,只是叫法上连在一起,由于历史原因。博主在04年学习数据结构时,书上也是说的堆栈,FILO(先进后出),经常将堆栈与队列,FIFO(先进先出)这两种数据结构进行比较。
系统中的堆、栈和数据结构堆、栈不是一个概念。系统中的堆、栈是真实的内存物理区,数据结构中的堆、栈是抽象的数据存储结构。
数据结构中的堆、栈:
1. 栈:后进先出的数据结构,数据项按序排列,只能在一端进行插入和删除。
2. 堆:完全二叉树或近似完全二叉树,效率高,常用于排序算法、Dijkstra算法、Prim算法等。
系统方面的堆和栈:
1. 栈区:由编译器自动分配释放,存放函数参数值、局部变量值等,操作方式类似于数据结构中的栈。
2. 堆区:可动态申请的内存空间,所有使用new xxx()构造出来的对象都在堆中存储,一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
Java里的堆、栈和常量池:
1. 栈与堆都是Java用来在Ram中存放数据的地方。Java自动管理栈和堆,程序员不能直接设置。
2. 栈优势:存取速度快,仅次于寄存器;缺点:数据大小、生存期必须确定,缺乏灵活性。
3. 堆优势:动态分配内存大小,使用new xxx()构造出来的对象都在堆中存储,生存期不必事先告诉编译器;缺点:存取速度较慢。
4. 常量池:存放字符串常量和基本类型常量,避免频繁创建和销毁对象,实现对象共享。
Java中的数据类型:
1. 基本类型:int, short, long, byte, float, double, boolean, char。
2. 包装类数据:Integer, String, Double等将相应基本数据类型包装起来的类,全部存在于堆中。
String是一个特殊的包装类数据,其创建过程:
1. 定义一个名为str的String类的对象引用变量放入栈中。
2. 在常量池中查找是否存在内容为"abc"字符串对象。
3. 如果不存在,则在常量池中创建"abc",并让str引用该对象。
4. 如果存在,则直接让str引用该对象。
String的intern()方法:查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其引用;如果没有,则在常量池中增加一个Unicode等于str的字符串并返回其引用。
结论与建议:
1. 使用String str = "abc";的方式,可以在一定程度上提高程序的运行速度。
2. 对于String str = new String("abc");的代码,则一概在堆中创建新对象。
3. 当比较包装类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==。
4. 由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类。