共同点:都是内存的一部分。

不同点

  :堆是一个运行时数据区,一般是用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 }
View Code

引用一位前辈的比喻:

  使用堆就像是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
  使用栈就像我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。

posted on 2020-04-15 19:59  小潘同学  阅读(224)  评论(0)    收藏  举报
-->