一个容易面试中被问到且踩到坑的问题:Long a=128L;Long b=128L;a==b为true吗?

你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。

点击下方👇关注公众号,带你一起复习后端技术,看看面试考点,补充积累技术知识,每天都为面试准备积累


依稀记得以前面试喜欢问这样的一个问题:

Long a = 128L;Long b = 128La==b 的结果是什么?如果是127呢?


在Java 中,使用 == 比较两个 Long 对象时,需要注意 值的范围 和 自动装箱 的特性。

01
Long 对象的自动装箱


当定义 Long a = 128L; 时,Java 会自动将 long 基本类型的值装箱为 Long 对象。

Java 对 Long 和其他包装类型(如 Integer、Short、Byte)的自动装箱有一个 缓存机制:

  • 默认情况下,Long 缓存了从 -128 到 127 的范围内的值(类似于 Integer 的缓存机制)。

  • 如果两个 Long 对象的值在这个范围内,Java 会复用同一个缓存实例。

  • 超出这个范围时,Java 会为每个数值创建新的 Long 对象。


02
使用 == 比较


== 比较的是 引用是否相同,即两个 Long 对象是否指向同一个实例。

对于值在 -128 到 127 范围内的 Long 对象,== 可能返回 true,因为它们使用的是缓存。

对于值超出这个范围的 Long 对象,== 会返回 false,因为它们是不同的实例。


03
举例说明


Long a = 128L; // 超出缓存范围,创建新的实例Long b = 128L; // 超出缓存范围,再创建一个新的实例System.out.println(a == b);  // false,因为引用不同System.out.println(a.equals(b)); // true,因为值相同Long x = 127L; // 在缓存范围内,使用同一个实例Long y = 127L; // 在缓存范围内,复用同一个实例System.out.println(x == y);  // true,因为引用相同System.out.println(x.equals(y)); // true,因为值相同


04
解决方案


如果比较两个 Long 的 值 而不是引用,应该使用 equals() 方法或先拆箱为 long 再比较:

Long a = 128L;Long b = 128L;/ 正确比较方式:System.out.println(a.equals(b)); // trueSystem.out.println(a.longValue() == b.longValue()); // true


05
总结


不能用 == 比较两个 Long 对象的值,因为超出缓存范围时,== 比较的是引用而不是值。

如果需要比较值,应使用 equals() 或将 Long 转为基本类型 long 再比较。


06
遗留问题


如果问题改成Integer a = 128; Integer b = 128;

或者Integer a = 128; int b = 128;

结果会是什么呢?

今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!

END


扫码关注

一起积累后端知识
不积跬步,无以至千里
不积小流,无以成江海

喜欢此内容的人还喜欢

谈谈id那些事(五)——美团的 Leaf 的ID生成


一个阿里二面面试官必问的问题


Lambda表达式说爱你不容易


分享面试:mysql数据库索引失效的情况


Spring-Boot中一个不起眼的好工具StopWatch