在 java 中,integer.equals 是 integer 类的一个方法,用于比较两个 integer 对象的值是否相等。虽然它看起来很简单,但在某些情况下可能会出现意想不到的行为。
本文将深入剖析 integer.equals 的工作原理,并探讨可能出现的特殊情况。
1.integer.equals的基本规则
integer 继承自 number 类,并重写了 equals 方法,源码如下:
@override
public boolean equals(object obj) {
if (obj instanceof integer) {
return this.intvalue() == ((integer) obj).intvalue();
}
return false;
}
规则解析:
- 首先检查
obj是否是integer实例,如果不是,直接返回false。 - 如果是
integer,则比较其int值(intvalue())。
示例:
integer a = 1000; integer b = 1000; system.out.println(a.equals(b)); // true,因为 1000 == 1000
尽管 a 和 b 可能是不同的对象(因为 1000 超出了 java 缓存范围),但 equals 只比较 值,所以返回 true。
2.integer.equals(int)的装箱问题
在 integer.equals 方法中,参数 object obj 可能是 自动装箱 过来的 integer,也可能是直接传入的 int。
java 提供了 自动装箱(autoboxing) 机制,会将基本类型 int 转换成 integer。
示例:
integer a = 1000; system.out.println(a.equals(1000)); // true
发生了什么?
1000是int,但equals(object obj)需要object,所以1000先被 自动装箱 为integer.valueof(1000)。a.equals(integer.valueof(1000)),进入equals方法后,obj是integer实例,因此比较intvalue(),返回true。
特殊情况:
integer a = 1000; system.out.println(a.equals(1000.0)); // false
1000.0是double,不会被装箱为integer,obj instanceof integer返回false,所以equals直接返回false。
3.==vsequals()
示例:
integer x = 100; integer y = 100; system.out.println(x == y); // true system.out.println(x.equals(y)); // true integer a = 1000; integer b = 1000; system.out.println(a == b); // false system.out.println(a.equals(b)); // true
为什么100和1000处理不同?
- java 对
-128 ~ 127之间的integer进行了缓存(integer cache),相同数值的integer会共享同一个对象,==也成立。 - 超过
127的数值 不在缓存范围内,integer.valueof(1000)会创建新对象,所以==比较的是不同的对象地址,返回false。
如何正确判断 integer 相等?
- ✅ 推荐使用
equals,避免缓存带来的困惑:
integer a = 1000; integer b = 1000; system.out.println(a.equals(b)); // true(比较的是值)
- ❌ 不要直接用
==,可能会出问题:
integer a = 1000; integer b = 1000; system.out.println(a == b); // false(因为是不同的对象)
4.null处理
示例:
integer a = null; system.out.println(a.equals(1000)); // 运行时报错:nullpointerexception
如果 a 为 null,那么调用 a.equals() 时会发生 nullpointerexception。
因此,在比较 integer 时,建议使用 objects.equals() 来防止空指针异常:
integer a = null; system.out.println(objects.equals(a, 1000)); // false,不会报错
objects.equals(a, b) 的实现相当于:
(a == b) || (a != null && a.equals(b))
这样就能避免 null.equals() 造成的异常。
5.equals()与compareto()的区别
在 integer 中,compareto() 也是一个常见的比较方法:
integer a = 1000; integer b = 2000; system.out.println(a.compareto(b)); // -1(1000 小于 2000) system.out.println(b.compareto(a)); // 1(2000 大于 1000) system.out.println(a.compareto(1000)); // 0(相等)
区别:
equals() 只返回 true/false,用于判断 相等性。
compareto() 返回:
负数(this < other)0(this == other)正数(this > other)
6. 总结
| 情况 | 代码示例 | 结果 | 原因 |
|---|---|---|---|
| equals() 比较两个 integer | new integer(1000).equals(new integer(1000)) | ✅ true | 比较的是数值 |
| equals() 直接比较 int | integer.valueof(1000).equals(1000) | ✅ true | 1000 先装箱为 integer(1000),再比较值 |
| equals() 与 double | integer.valueof(1000).equals(1000.0) | ❌ false | 1000.0 是 double,equals() 只支持 integer |
| == 比较 integer(缓存范围内) | integer x = 100; integer y = 100; x == y | ✅ true | -128 ~ 127 之间 integer 复用同一对象 |
| == 比较 integer(超出缓存范围) | integer a = 1000; integer b = 1000; a == b | ❌ false | 1000 超出缓存范围,创建的是两个对象 |
| null.equals() | integer a = null; a.equals(1000); | ❌ 抛异常 | a 为 null,调用 equals() 报 nullpointerexception |
| objects.equals() | objects.equals(null, 1000); | ✅ false | 避免 null 异常 |
integer.equals(object obj) 只比较值,不管对象地址。
integer 的 -128 ~ 127 之间的值会被缓存,超出范围的 integer 不能用 == 比较。
如果 integer 可能为 null,用 objects.equals(a, b) 避免空指针异常。
integer.equals(double) 直接返回 false,不会自动转换类型。
compareto() 适用于大小比较,而 equals() 只判断相等性。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论