大概三四个月前
准备面试时补习班老师给了我这个链接
Java 面试题:百度前200页都在这里了
http://www.importnew.com/27326.html
我试着爬文找答案
虽然没完成但总之也整理了一些资讯
先从stack 跟heap 开始…
stack:
1.stack在记忆体中用来存放可以预测生命周期的资料
以便作业系统管理,
可以想成一层一层堆起来的盒子里面会存放数值型别的变数或是引用,
当变数生命周期结束盒子就会被移走
2.如果管理的不好会产生stackoverflow
3.生命周期在scope内{ 这里面}也就是说跑到底就结束
heap
1.可动态申请之内存空间
2.java中new XXX()物件全部会放到heap中
一旦garbage collection system侦测到某对象没被引用就会销毁此物件
3.可想成在某个公园摆放得一团乱的盒子
物件参照会放到stack中的某个盒子,相对应的物件实体会放到公园中的某个空盒子
当物件实体生命周期结束,不再被引用,
就会被系统标注没人使用最后再把它删除
比较:
1.stack
优势:存取速度比heap还快
缺点: stack中存的数据大小生命周期都要固定缺乏灵活性
2.heap
优势:动态分配内存大小,生命周期不用告诉编译器
缺点:运行时要动态分配内存所以运行速度较慢
3.stack与heap一样
在java都是程式自动管理无法自行设定stack或是heap
4.stack存八大基本资料:
int, short, long, byte, float, double, boolean, char
数据还可共享
比如int a=3; int b =3;
此时
系统会先在stack创立reference (参照类型) a然后找有没有字面值为3的地址
没有的话
会自己创一个再将a指向它
接着创造reference b ,看到有字面值3的地址就指向它
改b = 4也不会删掉3这个字面值,系统会新增一个4的字面值在stack然后再让b指向它
5.wrapper会将资料存在heap
但String比较特殊
String a = “abc”; String b=”abc”;
String c = new String(“abc”); String d = new String(“abc”);
这样的情况下
a==b成立,会在stack共用abc
c==d就不成立,因为两者都会各新增一个实例再让reference指向它们
6.Integer i = 3底层会转为Integer i = new Integer(3)
这点跟String不一样