Integer对象的比较

本文解释了Java中Integer类的缓存优化导致的==与equals()比较差异,尤其是在处理相同数值但大小不同的对象时。重点讨论了为何较小的Integer实例使用==比较会返回true,而大数则不适用,以及何时务必使用equals()确保正确比较。
public class BoxingTest {
    public static void main(String[] args) {
        Integer x = 127;
        Integer y = 127;
        System.out.println("x==y = " + (x == y));       //较小的两个相同的Integer返回true
        System.out.println("x.equals(y) = " + x.equals(y));

        Integer m = 999;
        Integer n = 999;
        System.out.println("(m==n) = " + (m == n));     //较大的两个相同的Integer返回false
        System.out.println("m.equals(n) = " + m.equals(n));
    }
}

/*
x==y = true
x.equals(y) = true
(m==n) = false
m.equals(n) = true
*/

==比较,较小的两个相同的Integer返回true,较大的两个相同的Integer返回false,这是因为Integer是不变类,编译器把Integer x = 127;自动变为Integer x = Integer.valueOf(127);为了节省内存,Integer.valueOf()对于较小的数(<=127),始终返回相同的实例,因此,==比较“恰好”为true,但我们绝不能因为Java标准库的Integer内部有缓存优化就用==比较,必须用equals()方法比较两个Integer;
Java中,比较两个`Integer`对象小时,**会触发自动拆箱**过程。具体来说,当使用比较运算符(如`>`、`<`、`>=`、`<=`)对两个`Integer`对象进行比较时,Java会自动调用`intValue()`方法将对象拆箱为`int`基本类型,然后进行数值比较[^4]。 例如: ```java Integer a = 100; Integer b = 200; System.out.println(a < b); // 输出 true,因为 a 的值 100 小于 b 的值 200 ``` 在上述代码中,`a < b`的比较会自动将`a`和`b`转换为`int`类型后再进行比较。这与直接使用`int`变量比较的效果一致[^3]。 需要注意的是,**如果其中一个`Integer`对象为`null`,在拆箱时会抛出`NullPointerException`异常**。因此在实际开发中,应确保参与比较的`Integer`对象不为`null`,以避免运行时异常。 相比之下,如果使用`==`运算符比较两个`Integer`对象,结果可能与预期不符。这是因为`==`比较的是对象的引用而非值。例如: ```java Integer a = 127; Integer b = 127; System.out.println(a == b); // 输出 true ``` ```java Integer c = 128; Integer d = 128; System.out.println(c == d); // 输出 false ``` 上述行为与Java中`Integer`缓存机制有关。对于`-128`到`127`之间的整数值,Java会缓存对应的`Integer`对象,因此`a`和`b`引用的是同一个对象,`a == b`返回`true`。而超出该范围的值会创建新的对象,因此`c`和`d`引用不同的对象,导致`c == d`返回`false`[^1]。 ### 相关问题 1. Integer对象比较时为何会出现引用比较和值比较的区别? 2. 自动拆箱过程中可能引发哪些运行时异常? 3. JavaInteger类的缓存机制是如何工作的? 4. 在使用比较运算符时,Integer与int之间是如何自动拆箱的? 5. 如何安全地比较两个Integer对象小?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值