在上一篇文章中我们谈到了引用,这篇文章我们就来谈谈引用在基本数据类型与其对应的包装类应用与分析
先看看下面这段代码:
@Test
public void test() {
int a = 10;
int b = 10;
Integer c = 10;
Integer d = 10;
Integer e = new Integer(10);
Integer f = new Integer(10);
System.out.println("a == b: " + (a == b)); //①true
System.out.println("c == d: " + (c == d)); //②true
System.out.println("e == f: " + (e == f)); //③false
System.out.println("a == c: " + (a == c)); //④true
System.out.println("c == e: " + (c == e)); //⑤false
System.out.println("a == e: " + (a == e)); //⑥true
Integer m = 500;
Integer n = 500;
System.out.println("m == n: " + (m == n)); //⑦false
}
首先我们需要明白
①在方法区中,存储的相同常量只能为一个
②只要是通过new,来创建引用的,都需要在堆内存创建新的空间
③==永远是用来比较内存中的地址的,基本类型感觉上是在比较内容,实际上还是在比较地址
分析其引用过程:
①a,b为基本数据类型 ,堆中是不开辟内存的
当执行第一句代码时。先查找方法区中有没有10,没有,则开辟一个空间存放10,然后在栈中存入一个变量 a,让a指向10;
执行第二句的时候,查找发现10已经存在了,所以就不开辟新空间了。直接在栈中保存一个新变量b,让b指向2;
②c,d为int的包装类Interger
integer与integer比较的是引用的地址,并没有在堆中开辟新空间(不用new的情况下)
③e,f为Interger,integer与integer比较的是引用的地址,均在堆中开辟新的空间,各空间不一样
④a,c,一个为int,一个为Interger。首先Interger c先拆箱成int,再与a比较,此时c直接指向常量10,两者的值(指向的内存地址)一样。
这个分析同⑥
⑤c没有开辟新的空间,e开辟了新的空间,两者指向不一样
⑦两者均为Interger,但是为false。原因如图:
总结,分析如图: