堆:存放类类型,用new创建的,垃圾自动回收机制负责回收,速度慢。
(1) 堆是一个“运行时”数据区,类的实例化对象 是从堆上去分配空间的,堆上的 空间都是通过new去创建的 。
(2) 堆是动态分配内存大小的,即程序运行时分配的。
(3) 堆空间的内存读取比较慢。
new String("hello"); new出来的对象都是是存放在堆中。
栈:存放基本数据类型,速度快。
(1) 栈存放基本数据类型(byte,short,int ,long,float,double,boolean,char) 和对象句柄。
(2) 数据值共享,这是jvm栈的数据存取方式,int a = 10; int b = 10; a 、b指向的栈空间地址是同一个。
jvm处理的逻辑是,执行int a = 10; 在栈上创建一个变量作为a的引用,然后再在栈上查找10的地址,如果有就将a指向该地址,没有就存起来10的这个地址,
(3) 相比于堆,栈的速度更快。
(4) 方法结束后方法中的栈数据就清除了。
在栈中,只保存有基本类型的变量和对象引用。
引用所指向的对象保存在堆中。(引用可能为Null值,即不指向任何对象)。
例:
String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1==str2); //false
创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。