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值时也可以判断)

相关推荐
EntyIU20 分钟前
NFS离线部署
java
OH_TPC3 小时前
HarmonyOS APP开发---“滤镜大师“图像处理App,需要用到这个库
java·图像处理·华为·harmonyos·鸿蒙
imaol14 小时前
链表 -- 环链表
java·前端·链表
imaol15 小时前
链表 -- 双向链表
java·前端·链表
2601_963869955 小时前
【计算机毕业设计】基于Java的相框定制系统的设计与实现
java·开发语言·课程设计
于烛6 小时前
为什么hasNext() 对只有一个元素的集合返回 true?90%初学者都有的疑问
java
wuminyu6 小时前
JVM利用io_uring优化堆外内存性能原理剖析
java·linux·c语言·jvm·c++
imaol17 小时前
数据结构---队列
java·数据结构·算法
半亩码田7 小时前
【.NET新特性·第11篇】C# 14 字段属性:告别手写 backing field
java·c#·.net
JAVA面经实录9177 小时前
集合框架 (六)
java·开发语言