昨天下午去面试,面试官出了一道貌似很简单的题目给我看,其中有关于包装类和对应的基本类型的装箱与拆箱操作,还有就是java对于对象的分配内存方式。
int i=300;
Integer x=i;
Integer y=i;
System.out.println(x==y); //false
System.out.println(x==i); //true
System.out.println(y==i); //true
1.下面这行代码中基本值类型i在赋值给引用类型Integer x的时候自动装换为Integer类型,称之为装箱,并在栈中分配内存:
Integer x=i;//装箱
2.下面这行代码中引用类型Integer对象x与值类型的变量i进行比较时,java对x进行拆箱操作,把x转换为值类型,再进行比较,所以结果为true:
System.out.println(x==i);//true
3.两个引用类型对象进行==号比较,比较的是两个对象的内存空间地址,这个地址是由java来分配的,虽然值是相等的,但是每个对象都有独立的内存空间,所以是不相等的。
所以下面这行代码的输出结果为false:
System.out.println(x==y); //false
4.在最上面的代码中,i的初值为300,代码的执行结果是false,true,true,但是当把i的初始值变为-128~127这个范围的时候,输出结果却为true,true,true。
这个问题让我纳闷很久,最后在老师的帮助下找到了答案,这是因为在-128~127这个范围内,整个对象所占的内存空间不足一字节,所以java为了节省内存空间,就把
两个值相等的Integer对象都分配在了同一个内存空间中,所以x==y为true:
int i=100;
Integer x=i;
Integer y=i;
System.out.println(x==y); //true
System.out.println(x==i); //true
System.out.println(y==i); //true