关于装箱和拆箱的一道面试题

昨天下午去面试,面试官出了一道貌似很简单的题目给我看,其中有关于包装类和对应的基本类型的装箱与拆箱操作,还有就是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



转载于:https://www.cnblogs.com/windsliu/archive/2012/02/26/2369097.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值