Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈内存
用于存储变量如 基本数据类型和对象句柄。当数据使用完,所占空间会自动释放。
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。
堆内存
1,数组和对象,通过new建立的实例都存放在堆内存中。
2,每一个实体都有内存地址值。
3, 实体中的变量都有默认初始化值。
4,实体不再被使用,会在不确定的时间内被垃圾回收器回收。
例子:
int a = 1;
int b = 1;
编译器先处理int a = 1;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有1这个值,如果没找到,就将1存放进来,然后将a指向1。接着处理int b = 1;在创建完b的引用变量后,因为在栈中已经有1这个值,便将b直接指向1。 这样,就出现了a与b同时均指向1的情况,即是存在栈的数据可以共享,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度。 但是这和俩个对象的引用指向同一个对象不一样,因为修改a的值,b是不会变化的,因为编译器会完成。但是如果你修改对象后,俩个引用都会变化的。
String str1 = new String("java");
String str2= "java";
System.out.println(str1 == str2); //false
因为new为在堆中创建对象,而变量str2在栈中创建,然后查“java”是否在栈中,没有就存进来。二者是不一样的