共同点:都是内存的一部分。
不同点:
堆:堆是一个运行时数据区,一般是用NEW来分配的,空间是手动申请和释放的(Object a = new Object() ),通过垃圾回收器来销毁。例如:程序员定义一个malloc(10),自定义开辟十个字节的空间。堆的空间需要程序员手动释放,不然可以一直访问,如若忘记释放就容易造成内存泄漏。

栈:栈主要存放一些基本数据类型的变量(byte,short,int,long,float,double,boolean,char),等同于声明一个对象,空间由操作系统自动分配和释放(Object a = null);后进先出。例如:定义一个 char a,系统会自动在栈上为其开辟空间;栈数据可以共享。栈的空间是自创自放的,所以一般运行结束周期也结束了,便不可再访问。

例子:
1 public class SerializibleTest { 2 public static void main(String args[]) throws Exception{ 3 4 // new 创建的对象放在堆中,没调用一次创建一个对象 5 String s11 = new String("lan"); 6 String s12 = new String("lan"); 7 8 // 现在栈中创建对象的引用S21,如果栈中没有"lan",则将其数值放入栈中,并将S21指向"lan"。如果栈中已有数据"lan",则直接寻找赋值。 9 String s21 = ("lan"); 10 String s22 = ("lan"); 11 12 // == 比较的是内存地址是否相等 13 System.out.println(s11 == s12);// false 14 System.out.println(s21 == s22);// true 15 16 // equals比较的是数值是否相等 17 System.out.println(s11.equals(s12)); // true 18 } 19 }
引用一位前辈的比喻:
使用堆就像是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
使用栈就像我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
本人的笔记都是为了让自己记住并且便于复习很多容易忘记的知识点,不做任何商用。期间可能借鉴了很多前辈的解释,有各个网站上的相关内容借鉴总结,也有书籍里的总结,所以并没有标注来源,如有雷同敬请谅解。
浙公网安备 33010602011771号