java实现栈:Java中栈与堆的思考
疯狂代码 http://www.crazycoder.cn/ ĵ:http:/www.crazycoder.cn/Java/Article6426.html
1. 栈(stack)和堆(heap)都是Java用来在Ram中存放数据地方和C区别Java自动管理栈和堆员不能直接地设
置栈或堆
2. 栈优势是存取速度比堆要快仅次于直接位于CPU中寄存器但缺点是存在栈中数据大小和生存期必须是确
定缺乏灵活性另外栈数据可以共享详见第3点堆优势是可以动态地分配内存大小生存期也不必事先告诉编译器
Java垃圾收集器会自动收走这些不再使用数据但缺点是由于要在运行时动态分配内存存取速度较慢
3. Java中数据类型有两种
种是基本类型(primitive types), 共有8种即, , long, , float, double, boolean, char(注意并没有基本类型
)这种类型定义是通过诸如 a = 3; long b = 255L;形式来定义称为自动变量值得注意是自动变量存是字面值不是
类例子即不是类引用这里并没有类存在如 a = 3; 这里a是个指向类型引用指向3这个字面值这些字面值数据由于
大小可知生存期可知(这些字面值固定定义在某个块里面块退出后字段值就消失了)出于追求速度原因就存在于栈
中
另外栈有个很重要特殊性就是存在栈中数据可以共享假设我们同时定义:
a = 3;
b = 3;
编译器先处理 a = 3;首先它会在栈中创建个变量为a引用然后查找有没有字面值为3地址没找到就开辟个存
放3这个字面值地址然后将a指向3地址接着处理 b = 3;在创建完b引用变量后由于在栈中已经有3这个字面值便
将b直接指向3地址这样就出现了a和b同时均指向3情况
特别注意是这种字面值引用和类对象引用区别假定两个类对象引用同时指向个对象如果个对象引用变量修
改了这个对象内部状态那么另个对象引用变量也即刻反映出这个变化相反通过字面值引用来修改其值不会导致
另个指向此字面值引用值也跟着改变情况如上例我们定义完a和b值后再令a=4;那么b不会等于4还是等于3在编
译器内部遇到a=4;时它就会重新搜索栈中是否有4字面值如果没有重新开辟地址存放4值;如果已经有了则直接将
a指向这个地址因此a值改变不会影响到b值
另种是包装类数据如Integer, String, Double等将相应基本数据类型包装起来类这些类数据全部存在于堆
中Java用语句来显示地告诉编译器在运行时才根据需要动态创建因此比较灵活但缺点是要占用更多时间 4.