堆;
堆是用来存放的new创建的对象和数组,每一个对象都指向一个新的内存。
栈:
栈是用来存放基本类型变量和对象的引用变量存放的地方。里面存放的数据可以共享,但是如果存入一个数据栈里面没有那它就会创建这个变量。基本类型就是四类八种!
优缺点:
栈的有点就是存取速度快,缺点就是其生存时间和数据大小必须确定,缺乏灵活性。而堆的话相对于栈优点就是不需要知道数据的大小与存在时间。java的垃圾收集器会自动清理不用的数据。缺点就是每回存储一个数据就要为其创建一个内存空间,存储熟读比较慢。
下面举一些例子方便理解:
栈;
int a=3;
int b=3;
这里的a与b公用一个数据那就是3.故a=b;
String str="abc";
String str1="abc";
这里是一个对象的应用变量 故str=str1。如果不知道你可以用==来判断存储地址是否相等。
堆:
String str=new String("abc");
String str1=new String("abc");
这里的话str与str1就不相等,因为他们的存储地址是不同的。
下面再更详细解析一下例子以便我们更好的理解:
从例子讲解解析
Test test=new Test(1);
这里的new test(1) 它是储存在堆里面的,当然我们还可以在栈里面找到一个test变量。它的取值取决去堆中new test(1)的首地址,而栈中test这个变量就相当于new test(1)的一个引用变量。
引用变量就相当于给我们的new test(1) 起了一个别名,让我们就可以在栈中用这个别名引用堆中的对象。
局部变量永远在栈里。