目录
- 1.Integer.equals的基本规则
- 2.Integer.equals(int)的装箱问题
- 3.==vsequals()
- 4.null处理
- 5.equals()与compareTo()的区别
- 6. 总结
在 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
进行了缓存(Intege编程客栈r 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
(thisjavascript == 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() 只支持 Integjavascripter |
== 比较 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()
只判断相等性。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论