栈(stack)
-
概念:用于存储局部变量,数据使用完毕之后,将自动释放。
-
优势:
- 在栈中的存取速度是比堆(heap)快的。
- 栈中的数据是可以共享的。
举例:
int A = 7;
int B = 7;
1、首先"7"这个值,因为大小可知,生命期可知(在程序中定义使用,程序结束后就会消失。)
2、所以程序会在栈中去创建变量A,变量A中去存放7的值的地址。
3、现在又要去创建一个变量B,由于在栈中已经拥有了"7"这个值的地址,所以变量B将直接引用"7"的地址。
4、此时,变量A和变量B存放的地址,都是值为"7"的地址。这也就能体现,在栈中的数据是共享。
这个时候就有一个新的问题将抛出,如果这个时候让A=5。变量A和变量B的会一样吗?
1、首先编译器识别到A=5,会在栈中去搜寻是否存在值为"5"的地址。若存在,那么直接引用,若不存在,则会重新开辟新的地址去存放"5"的值。
2、所有无论在栈中变量A怎么变,变量B都不会发生改变,因为变量B的值始终都是"7",不会因为变量A的值改变而改变。
- 缺点:
- 在栈中的数据的大小和生命期必须是确定的,不够灵活。
堆(heap)
-
概念:通过new一个对象,或者创建一个数组的时候,就会在堆中开辟一部分空间用于存放。创建出来的对象都拥有默认值。当不在被使用的时候就会被自动回收处理。
-
优势:
- 在堆中,可以动态的去分配内存的大小,生命期也不需要提前准备好。
- 在Java的垃圾回收机制中,会自动回收不再使用的数据。
-
缺点:
- 因为堆是动态分配内存的,所以存取速度会较慢。
堆和栈的区别
- 相同点:
- 都是Java内存的一种。
- 使用完毕之后,Java垃圾回收机制都会自动的去回收它们。
- 不同点:
- 栈内存:
- 栈内存中一般都会存放8种基本数据类型的变量、对象的引用和方法。
- 栈中遵循,先进后出的规则。
- 占内存中不能被其他线程所访问。
- 栈内存生命周期短。
- 堆内存:
- 存放new出来的对象和数组。
- 堆中遵循,先进先出,后进后出的规则。
- 存储在堆中的对象,是能够被全局是访问的。
- 堆内存生命周期是从,程序开始运行到运行结束。
- 栈内存: