浅析Java自动装箱和拆箱

  最近在面试的时候,面试官提了一个很有趣的问题,如果这样定义:

  int a = 1; Integer b = 1;你觉得a ==b?还是怎么样?如果换成1000呢?

  当时我没有回答的出来,按照常规的思维,我觉得Integer是一个对象,int乃是基本的数据类型,所以我觉得这两者应该是不等吧?因为==比较的是两个是否为同一个对象,但是验证之后才发现事实不是这么回事。

  于是我刨根问底发现,造成这样的原因是Java的自动拆箱的问题,而Java 1.5之前是需要我们手动迁移拆箱的,所以按照本来的思维判断是没错的,那这个到底是怎么一个过程呢?根据问题查找答案:

   Integer b = 1;

  当我们这样定义的时候,其实已经执行了自动拆箱,b = Integer.valueOf(1); b = Integer.intValue(); 所以b = 1,是int类型的

  当Integer b = 1000时,其实也是一样的过程。

  但是如果换成Integer a = 1;Integer b = 1;  Integer c = 1000; Integer d = 1000;这样得出的结果会是一样吗?一开始我觉得这样不是一样的吗?一样会执行自动拆箱的啊?但是结果又令我受益匪浅,这两个的结果竟然不相等。一个为true,一个为false

  那么造成这样的原因是什么呢?原来Integr包装类会默认缓存-127-128的数值在常量池中,而超出这个的不会缓存,所以会出现false。但是如果又换成Integer a = new Integer(1);Integer b = new Integer(1);这样呢?我原来以为这个不就是一样的吗?但是结果却是另一个,因为这样的操作没有涉及到自动拆箱,所以这两个是引用不同的对象,所以是false。

 那么自动装箱呢?又是怎么回事?其实是反着进行:   

List<Integer> list = new ArrayList<Integer>();
list.add(2);
list.add(3);
list.stream().forEach(x->System.out.println(x));

上面的这个例子就是,如果没有自动装箱的话,在编译期间应该会报错。

Java的自动装箱给我们带来了很多的便利的,但是使用的时候要注意,避免出现下面的情况:

Integer a = 0;
for(int i = 0;i<10;i++){
a+=i;
}

这样会造成创建不必要的对象。那在实际使用的时候应该使用int还是Integer就看个人需要了,int的默认值为0,而Integer为null。

Java中除了这个有意思之外,不可变的String也是很有意思的,比如它的intern()方法,后面再继续理解,其实造成我们不敢确认是因为我们对常量池的理解不够深入,需要慢慢来学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值