java 中堆和栈的问题

来源:百度知道 编辑:UC知道 时间:2024/06/16 17:25:31
我知道在java中基本类型变量是存储在栈中,而引用对象(也就是new)存储在堆中.我想问要是一个基本类型变量int i=1;那么 i是存储在栈里,而 1 存储在堆里,我这样理解对吗?

String s1 = "hello";
String s2 = "world";
String s3 = "hello";
此时的s1=s3,String s1 = "hello"; 它是在栈中给s1分配一个变量hello,当s3再次分配的时候它会先去从栈中找看有没有hello变量,如果有就直接连接到那个地址,没有就新创建一个,所以此时s1和s3是指向同一个地址,内容相同,记住,他们是存放在栈中。

s1 = new String("hello");
s2 = new String("hello");
此时s1 != s2,对与new来说,它是在内存中分配空间,new s1是它会给s1分配一个空间存放hello,当new s2时,它会给s2分配另一空间存放hello,它们的地址是不同的,所以不相等,而且还要注意的是 “=”比较的是引用,相等于地址吧,所以二者不等,但是你用equals时它们就是相等的,即s1.equals(s2)返回的是true,因为它比较的是对象值。记住,new是在内存中分配空间。

看看这个,把String s1 = "hello"理解成int i= 1,
s1 = new String("hello")理解成 i = new Integer(1);

堆里面存储的是new()创建的变量
基本类型应该存在栈中
变量和引用一起都在栈中

理解不够,建议去看下《Java编程思想》和组成原理

基本数据类型在栈中 不在堆中 所以java不是纯面向对象 为了解决而引出的Integer包装int

i=1在栈里 new Integer(1)这个1在堆里

栈里

可以 参考 c#中的 装箱 和拆箱