你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。
依稀记得以前面试喜欢问这样的一个问题:
Long a = 128L;
Long b = 128L;
a==b 的结果是什么?如果是127呢?
在Java 中,使用 == 比较两个 Long 对象时,需要注意 值的范围 和 自动装箱 的特性。
当定义 Long a = 128L; 时,Java 会自动将 long 基本类型的值装箱为 Long 对象。
Java 对 Long 和其他包装类型(如 Integer、Short、Byte)的自动装箱有一个 缓存机制:
默认情况下,Long 缓存了从 -128 到 127 的范围内的值(类似于 Integer 的缓存机制)。
如果两个 Long 对象的值在这个范围内,Java 会复用同一个缓存实例。
超出这个范围时,Java 会为每个数值创建新的 Long 对象。
== 比较的是 引用是否相同,即两个 Long 对象是否指向同一个实例。
对于值在 -128 到 127 范围内的 Long 对象,== 可能返回 true,因为它们使用的是缓存。
对于值超出这个范围的 Long 对象,== 会返回 false,因为它们是不同的实例。
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,因为值相同
如果比较两个 Long 的 值 而不是引用,应该使用 equals() 方法或先拆箱为 long 再比较:
Long a = 128L;
Long b = 128L;
/ 正确比较方式:
System.out.println(a.equals(b)); // true
System.out.println(a.longValue() == b.longValue()); // true
不能用 == 比较两个 Long 对象的值,因为超出缓存范围时,== 比较的是引用而不是值。
如果需要比较值,应使用 equals() 或将 Long 转为基本类型 long 再比较。
如果问题改成Integer a = 128; Integer b = 128;
或者Integer a = 128; int b = 128;
结果会是什么呢?
今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!