自动装箱的疑惑(jdk1.5中自动装/折箱的新特性)

本文深入探讨了Java中Integer缓存的工作原理,解释了valueOf方法如何处理-128到127之间的整数,使其返回相同的缓存对象,而对于超出此范围的整数则创建新对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在论坛里看到这样一个题目

        int k = 100;
        Integer int1 
= Integer.valueOf(k);
        Integer int2 
= Integer.valueOf(k);       
        System.out.println(
"a." + (int1 == int2));//true
        k = 200;
        Integer int3 
= k; 
        Integer int4 
= k;
        System.out.println(
"b." + (int3 == int4));//false
        char c = 'A';
        Character char1 
= c;
        Character char2 
= c;
        System.out.println(
"c." + (char1 == char2));//true
        c = '';
        Character char3 
= c;
        Character char4 
= c;
        System.out.println(
"d." + (char3 == char4));//false

 问结果是什么.答案我都写在了后面.

对于Integer int1 = Integer.valueOf(k);

这句我们都知道是jdk1.5加上的自动装折箱功能.也就是自动的进行原始类和其封装类的互转.

可是后面的int1 == int2返回true而同样的方法int3 == int4返回false就让人想不通了.

最后还是看了jdk的源码才明白过来

valueOf()的源码:

   public static Integer valueOf(int i) {
    
final int offset = 128;
    
if (i >= -128 && i <= 127// must cache 
        return IntegerCache.cache[i + offset];
    }

        
return new Integer(i);
    }

它对大小是byte(-128-127)做了处理,它是从IntegerCache初始化的256个Integer缓存中取.

这样就只有一个对象当然就是true了,而后面的200超出了这个范围就是用new Integer(i)产生了一个新的对象,返回就是false了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值