Java128陷阱&自动拆装箱

一、什么是128陷阱

在我们比较Integer类型的两个数据时会发现,明明两个相同的值,最后比较结果为false,这就是所谓“Java128陷阱”

        Integer n1 = 128;
        Integer n2 = 128;
        System.out.println(n1 == n2);

二、理解128陷阱 (自动装箱与自动拆箱

首先理解自动装箱与自动拆箱

在上面的示例中我们用Integer定义的数其实是简写形式,正确的写法:(自动装箱)

Integer n1 = Integer.valueOf(128);
Integer n2 = Integer.valueOf(128);

Integer就是int的包装类,自动装箱就是将基本数据类型转换为包装类;自动拆箱就是将包装类转换成基本数据类型

        Integer d = 10;//自动装箱 Integer b = Integer.valueOf(10);
        int e = d;     //自动拆箱  int e = d.intValue

128陷阱出现的原因就是Integer的valueOf方法中有一个存储[-128-127]的catch数组,这个数组就相当于一个缓存,当我们定义的数在-128-127之间时,就直接返回该内存中的地址

Integer中的valurOf方法

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

所以当我们用==比较两个用Integer定义值为128的数时,会返回false,此时n1和n2是封装在两个对象中,比较应用.equals()方法

        Integer n1 = 128;
        Integer n2 = 128;
        System.out.println(n1.equals(n2));

这就是所谓的128陷阱 

三、8种基本数据类型对应的包装类

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值