![](https://csdnimg.cn/release/download_crawler_static/89211963/bg3.jpg)
象在堆内存中占据的空间是互不相同的。如果有
Rectangle r1=new Rectangle(3,5);
Rectangle r2=r1;
则在堆内存中只创建了一个对象实例,在栈内存中创建了两个对象引用,两个对象引用
同时指向一个对象实例。
3.3 包装类数据的存储
基本型别都有对应的包装类:如 int 对应 Integer 类,double 对应 Double 类等,基本
类型的定义都是直接在栈中,如果用包装类来创建对象,就和普通对象一样了。例如:int
i=0;i 直接存储在栈中。 Integer i(i 此时是对象) = new Integer(5);这样,i 对象数据存
储在堆中,i 的引用存储在栈中,通过栈中的引用来操作对象。
【数据存储在堆中,引用存储在栈中】
3.4 String 类型数据的存储
String 是一个特殊的包装类数据。
可以用 String str = new String("abc");的形式来创建;
也可以用 String str = "abc";的形式来创建。
第一种创建方式,和普通对象的的创建过程一样;
第二种创建方式,Java 内部将此语句转化为以下几个步骤:
(1)先定义一个名为 str 的对 String 类的对象引用变量:String str;
(2)在栈中查找有没有存放值为“abc”的地址,如果没有,则开辟一个存放字面值为“abc”
的地址,接着创建一个新的 String 类的对象 o,并将 o 的字符串值指向这个地址,而且在栈
中这个地址旁边记下这个引用的对象 o。如果已经有了值为“abc”的地址,则查找对象 o,并
返回 o 的地址。
(3)将 str 指向对象 o 的地址。
值得注意的是,一般 String 类中字符串值都是直接存值的。但像 String str = "abc";这
种场合下,其字符串值却是保存了一个指向存在栈中数据的引用。
为了更好地说明这个问题,我们可以通过以下的几个代码进行验证。
String str1=“abc”;
String str2=“abc”;
System.out.println(s1==s2);//true