一、从存储数据来区分:
Java中的堆(Heap)是一个运行时数据区,用来存放类的对象;
栈(Stack)主要存放基本的数据类型(int、char、double等8种基本数据类型)和对象句柄(也可以理解为地址,不是对象本身);
二、适用范围区分
Java中堆(Heap)是属于进程,比如启动一个tomcat是一个进程,这个进程有一个堆;
栈(Stack)属于线程,每个请求都可以是一个线程,每个线程有一个属于自己的栈空间,所有线程公用堆(Heap)空间
三、数据结构不同
Java中堆(Heap)和数据结构(属于树结构)的堆并不是一回事。
栈,就是数据结构的栈结构,符合栈的后进先出特点
四、访问性能不同
栈的访问速度更快
五、内存回收机制不同
堆(Heap)内存通过垃圾收集器回收;
栈通过,压栈出栈,方法执行结束后,出栈完成,空间释放;
例
例子1:
以上例子中,String是一种对象,因此存放在堆中;
首先在堆中创建一个ABC字符串,然后将地址给a,然后a又将地址给了b,所以第一个输出是true;
创建c的时候,通过new关键字,又在堆中创建了一个字符串ABC,然后地址给了c,所以第二个输出是false;
这里又引出一个知识点==比较的是两个变量的实际值(句柄或者理解为地址),而不是堆中的ABC,
大家可以自己试试下面几种情况,这还会引出另外一个知识点