Integer、Long 等包装类 == 值判断、地址判断与缓存

先看下以下代码和输出

java 复制代码
   public static void main(String[] args) throws Exception{
        Integer a=-128;
        Integer aa=-128;
        System.out.printf("a=aa? %s \n",a==aa);
        Integer b=127;
        Integer bb=127;
        System.out.printf("b=bb? %s \n",b==bb);
        Integer c=128;
        Integer cc=128;
        System.out.printf("c=cc? %s \n",c==cc);
        Integer d=126;
        Integer dd= new Integer(126);
        System.out.printf("d=dd? %s \n",d==dd);
        int e=12611;
        Integer ee= new Integer(12611);
        System.out.printf("e=ee? %s \n",e==ee);
        int f=12611;
        Integer ff= 12611;
        System.out.printf("f=ff? %s \n",f==ff);

    }

a=aa? true
b=bb? true
c=cc? false
d=dd? false
e=ee? true
f=ff? true

那么为什么会会出现这样的结果呢?

这是因为==只有在Java基本类型(short,int,long,byte,char,float,double,boolean)中比较的是值,其他类型中比较的是内存地址。因此,InteGer类中==比较的是内存地址,而不是值从而导致c和cc因为内存地址不相同导致c==cc不相同。

那为什么a=aa 和 b=bb 运行起来又是ture呢?

这是因为Integer类在-128至127(默认)区间的Integer实例缓存到cache数组中,所以

a=aa 和 b=bb都是true

那为什么d=dd 运行起来又是ture呢,他们都在-128和127之间啊?

这是因为区间的Integer实例缓存不包含new出来的对象

总结

Integer 和 int == 这样判断相等是可以的,

而Integer 和 Integer 要判断相等,推荐用equals (NULL值时也可以判断)

相关推荐
小羊没烦恼!19 小时前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里19 小时前
java中的继承和多态的区别
java
小羊没烦恼!19 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕19 小时前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码20 小时前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖20 小时前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时20 小时前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang21 小时前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi21 小时前
mysql 查询所有表名并授权
java
ProcessOn官方账号21 小时前
java函数式编程--入门基础
java·编程·函数式编程