阿里巴巴开发手册里面有一条强制的规则,说的是在包装类对象之间的值比较的时候需要使用 equals 方法,在 -128 和 127 之间的数值比较可以使用 ==,如下图所示。具体的原因相信大家都知道,虽然规则中提到 -128 和 127 之间的数值比较可以使用 ==,但强烈建议还是不要这样,包装类统一使用 equals,特别是如果有些数值是通过 API 或者 RPC 接口过来的,一定要注意。

看看下面的程序

public class IntegerEqualTest {public static void main(String[] args) {Integer a = genA();//Integer a = genB();Integer b = 0;if (a == b) {System.out.println("a == 0");} else {System.out.println("a != 0");}System.out.println(a == b);System.out.println(a == 0);}private static Integer genA() {return new Integer(0);}private static Integer genB() {return 0;}
}

大家可以先看下上面这一段代码,先猜测一下运行的结果是什么,如果再把 Integer a = genA(); 这行注释,Integer a = genB(); 这行放开,运行的结果又是什么。

好,1 2 3 结果如下所示

当替换注释那一行的时候,运行结果如下

看到这里其实很多小伙伴都知道是为什么,因为 genA() 方法里面是使用的 Integer 的构造器,构造的是一个新的对象,所以在使用 == 做对比的时候,比较的两个对象是不一样的。

是的,原因是这个,但是还有一点没说清楚那就是为什么在使用 genA() 的时候,下面的结果会不一样。

System.out.println(a == b);//false
System.out.println(a == 0);//true  

其实短短的几行代码里面,包含了好几个知识点,分别是自动装箱拆箱以及 Integer 的 -128 到 127 的数字缓存。

装箱拆箱

装箱:自动将基本数据类型转换为包装器类型;

拆箱:就是自动将包装器类型转换为基本数据类型。

在装箱的时候自动调用的是 Integer 的 valueOf(int) 方法。而在拆箱的时候自动调用的是 Integer 的 intValue方法。

上面的代码中 Integer b = 0; 会触发自动的装箱调用 Integer valueOf() 方法。而在使用 a == 0 这句的时候,会触发自动的拆箱。然后我们看源码会发现有下面缓存的逻辑,其中 IntegerCache.low 是 -128IntegerCache.high 默认是 127,不过可以通过 JVM 参数进行配置。这里的代码是 0,所以会从缓存中获取。

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

为了充分说明 Integer 的缓存,我们看下下面这段程序的执行结果

Integer c1 = 128;Integer c2 = 128;
System.out.println(c1 == c2);

在运行之前先自己分析一下,首先 Integer c1 = 128 和 Integer c2 = 128 按照上面说的,会触发自动装箱调用 valueOf 方法,通过 valueOf源码可以看到在默认的情况下 128 已经不再 Integer 的缓存里面了,所以 if 条件不满足会通过 new Integer 构造方法创建两个对象,所以最终的结果应该是输出 false

下面再说一下为什么说在 -128 和 127 以内的也不建议直接使用 == 来实现比较,很显然就跟上面的genA() 方法一样,很多时候不会一下子就知道一个方法值是怎么得到,即使是缓存范围以内,别人也有可能是通过构造函数创建出来的,这样在做比较的时候很有可能就会跟预期的不一样,从而产生事故。

特别是如果通过 RPC 接口获得返回结果,我们可能连别人的实现方式压根就看不到,更没办法提前知道了。所以还是得老老实实的按照阿里巴巴的 Java 规范来编写代码,采用equals 方法来判断,这样肯定没问题。

需要更多教程,微信扫码即可

两个 Integer 数值之间不建议使用 “==” 进行比较相关推荐

  1. java中两个Integer类型的值相比较的问题

    转载自: https://www.cnblogs.com/xh0102/p/5280032.html 两个Integer类型整数进行比较时,一定要先用intValue()方法将其转换为int数之后再进 ...

  2. 统计两个IP地址之间的IP个数

    问题 求两个IP地址之间的IP个数,例如192.18.16.1~192.18.16.5,2001:DB8:0000:0023:0008:0800:200C:417C~2001:DB8:0:23:8:8 ...

  3. 如何将两部手机内容互换_两部iPhone手机之间如何大量互传照片?

    不少iPhone用户在传照片的时候,都会第一时间打开微信进行操作.微信传照片是不错,但是单次最多只能发9张照片,而且接收的那一方,在接收照片之后还要手动把照片保存到手机上,效率低所以不适合大量传照片. ...

  4. integer为null_比较两个Integer,为什么必须使用equals?不用==

    equals和==的区别 对于基本类型,比如int.long,进行判等,只能使用==,比较的是直接值,因为基本类型的值 就是其数值. 对应用类型,比如Integer.Long和String,进行判等, ...

  5. 两服务器文件异地同步,两台群晖之间Moments异地同步方法探索

    两台群晖之间Moments异地同步方法探索 2020-07-29 21:12:05 3点赞 6收藏 3评论 手里有一黑一白两台群晖,一直在寻找两台设备之间Moments文件异地同步的方法. 因为群晖里 ...

  6. 《数字图像处理》dlib人脸检测获取关键点,delaunay三角划分,实现人脸的几何变换warpping,接着实现两幅人脸图像之间的渐变合成morphing

    这学期在上<数字图像处理>这门课程,老师布置了几个大作业,自己和同学一起讨论完成后,感觉还挺有意思的,就想着把这个作业整理一下 : 目录 1.实验任务和要求 2.实验原理 3.实验代码 3 ...

  7. 两台群晖服务器如何同步文件,两台群晖之间Moments异地同步方法探索

    两台群晖之间Moments异地同步方法探索 2020-07-29 21:12:05 3点赞 6收藏 3评论 手里有一黑一白两台群晖,一直在寻找两台设备之间Moments文件异地同步的方法. 因为群晖里 ...

  8. mysql查询两张表的同一列_如何快速查找两个数据表之间的相同和不同?

    原标题:如何快速查找两个数据表之间的相同和不同? 知识 随笔 案例 声音 其他 编者按 工作中经常会遇到对来源不同的数据进行比对,查找相同.不同.差异性等.过于复杂的需求,我们通常会转换思路,使用数据 ...

  9. LeetCode简单题之两个相同字符之间的最长子字符串

    题目 给你一个字符串 s,请你返回 两个相同字符之间的最长子字符串的长度 ,计算长度时不含这两个字符.如果不存在这样的子字符串,返回 -1 . 子字符串 是字符串中的一个连续字符序列. 示例 1: 输 ...

最新文章

  1. 【Java工具类】使用Random类对象生成随机整数
  2. 将一个数组输出到模板中来处理2
  3. 一道经典的SQL面试题
  4. boost::test模块测试从数据集对主测试套件的访问
  5. 探秘Java中的String、StringBuilder以及StringBuffer
  6. 修改USB固件库的Customer_HID例程
  7. 14Linux远程登录And15Linux远程文件传输
  8. NUC1178 Kickdown【水题】
  9. matlab练习程序(非负矩阵分解)
  10. python模块-转载于武沛齐
  11. python卡尔曼滤波_卡尔曼滤波+单目标追踪+python-opencv
  12. nas共享服务器怎么同步文件,如何轻松在两个NAS之间文件同步?
  13. ojdbc maven
  14. centos服务器修改密码,linux centos默认的密码
  15. 【欧拉计划第 1 题】3 或 5 的倍数 Multiples of 3 or 5
  16. twitter授权登录 php,PHP版实现Twitter第三方登录的成功案例
  17. 抖音测试的软件,抖音app测试版
  18. AT4352 [ARC101C] Ribbons on Tree
  19. 渗透测试实践指南:必知必会的工具与方法学习笔记(二)——扫描
  20. 逐步回归matlab函数,逐步回归matlab程序

热门文章

  1. 卢伟冰:Redmi K30 Pro的主板可能是业内最复杂“三明治”主板设计
  2. 苹果宣布对2019款iPad降价:最高降幅达500元
  3. 钱准备好了吗?中国移动将在10月公布5G套餐资费
  4. vivo NEX 3探索5G手机极致新形态:99.6%瀑布屏让左右无界 未来无限
  5. 我太难了!男子打赏女主播被骗9.6万,求助“好心人”再度被骗...
  6. 三星GalaxyNote 10 Plus官方图曝光:前置相机竟换成了单摄?
  7. 称特价影票被取消后影片仍正常放映 购票人起诉淘票票索赔500元
  8. 毛谦解读“Pb/s级光传输”:技术的恩惠远不止于此
  9. android.view.WindowManager$BadTokenException
  10. jvm垃圾回收之类加载机制