前言

java的内存有两种:堆内存和栈内存,堆和栈都是用来在内存中存放数据的地方,只是各自的运行机制有所不同。

什么是堆

堆,是运行时数据区,通过new等指令建立的对象从堆中分配空间,然后通过GC垃圾回收器来进行销毁。

堆的内存空间大小,是由java自己在运行时动态分配的,不需要我们指定设置。不过,也因此导致对的存取速度相对比较慢。

下面的案例,存放在堆中:

1
Integer num = new Integer(123);

什么是栈

栈,主要存放一些基本数据类型的变量和对象的引用,栈的数据是可以共享的。

基本数量类型:

1
byte,short,int,long,float,double,boolean,char

栈的内存空间大小,在程序编译时,就指定确认下来。所以栈的存取速度比堆快,而且仅次于寄存器。

下面的案例,存放在栈中:

1
Integer num = 123;

验证他们的区别?

堆和栈,我们已经有了对它们了解,也认识了它们的区别,那么我们来看看如何去进行验证?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void main(String[] args) {
// 堆数据,每个new出来的对象都独立占用一块内存
Integer num_d_1 = new Integer(123);
Integer num_d_2 = new Integer(123);

// 栈数据,存放的是对象的引用
Integer num_z_1 = 123;
Integer num_z_2 = 123;

// 基本数据类型,存放在栈中
int num_j_1 = new Integer(123);
int num_j_2 = 123;

System.out.println("堆对象比较:" + (num_d_1 == num_d_2));
System.out.println("栈对象比较:" + (num_z_1 == num_z_2));
System.out.println("基本数据类型比较:" + (num_j_1 == num_j_2));
}

输出:

1
2
3
堆对象比较:false
栈对象比较:true
基本数据类型比较:true

上面的案例,诠释了它们的区别:
堆,每个new出来的对象都独立占用一块内存地址,所以两者不相等。
栈,因为上一个值存在,而直接指向了相同的内存地址,所以两者相等。
基本类型,存放的就直接是值,所以相等。