两个值相同的Integer对象的比较

本文通过一个具体的Java示例,详细解析了equals方法的工作原理,包括基本类型与引用类型的比较区别,以及Objects类提供的equals方法如何实现对null值的安全处理。

 

 

package com.jj.test;

import java.util.Objects;

public class ObjectEqualsTest {
    public static final Integer COUNT_NONE = 0;
    public static void main(String[] args){
        Integer a=new Integer(0);
        boolean bool = Objects.equals(a,COUNT_NONE);
        a.equals(COUNT_NONE);
        System.out.println(a==COUNT_NONE);/*1*/
        System.out.println(bool);/*2*/
        System.out.println(a.equals(COUNT_NONE));/*3*/
    }
}

运行结果:

false
true
true

1.结果的第一行是false原因为:

两个integer引用的地址不同,==比较的是引用(内存地址),所以最终结果是false。 

2.通过源码可以很清楚的看到后两个结果是true的原因:

Objects对象中equals方法的源码:

  public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

Integer对象中重写的Object.equals()方法:

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

 

转载于:https://www.cnblogs.com/Allen-win/p/8059019.html

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对象的大小?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值