Integer类型比较

本文详细介绍了在Java中比较Integer类型值时,应当使用equals方法而非==运算符,因为equals进行了重写以比较数值。同时强调在使用equals前需要进行判空处理,避免空指针异常。Integer在[-128,127]范围内的值会复用对象,因此在这个范围内使用==比较数值是可行的。此外,可以使用intValue()方法获取int值进行直接比较。

1、需求:

        比较两个Integer类型的值是否相等

2、equals方法:

                两个Integer类型的数值比较不能使用==比较
                应该使用.equals进行比较

                注意在使用equals方法前对equals前面的对象进行判空处理

3、Integer中重写了equals方法,源码如下:

    public boolean equals(Object obj) {
      if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();//调用下方方法,返回一个基本类型数值
      }
      return false;
    }

    public int intValue()  
    {  
      return value;  
    }

4、实例代码:

Integer staYear = StudentUtiles.getStaYear;//有可能为空
if (staYear != null && staYear.equals(student.getStaYear)) {
        //staYear一定要先判空,否则抛出 空指针异常
   
}

3、引用总结:

“==比较地址,equals比较值”这个还是挺靠谱的。但是对于包装类和基本类型,还要涉及它们的自动装箱、自动拆箱,所以小心一点还是比较好的,尤其是在以后的面试中,不要走到别人挖的陷阱中。

1. Integer 类型的值在[-128,127] 期间,Integer 用 “==”是可以的   , Integer  与 int 类型比较(==)比较的是值。
2. 如果要比较Integer的值,比较靠谱的是通过Integer.intValue();这样出来的就是int值,就可以直接比较了;或者equals()比较


参考链接:https://blog.youkuaiyun.com/w112736112736/article/details/77986283

### 如何正确比较 Integer 类型的值是否相等 在 Java 中,`Integer` 是一个包装类,用于将基本数据类型 `int` 封装为对象。由于 `Integer` 是引用类型,因此使用 `==` 比较两个 `Integer` 对象时,实际上比较的是它们的内存地址,而不是它们封装的值[^1]。 #### 使用 `.equals()` 方法 为了正确比较两个 `Integer` 对象所封装的值是否相等,应该使用 `.equals()` 方法。此方法会检查两个对象的值是否相同,而不仅仅是它们的引用是否相同[^2]。 ```java Integer a = 10; Integer b = 10; System.out.println(a.equals(b)); // true ``` #### 使用 `.intValue()` 方法 另一种方法是通过调用 `.intValue()` 将 `Integer` 对象转换为基本类型 `int`,然后使用 `==` 进行比较。这种方式可以直接比较两个 `int` 值,从而避免了引用比较的问题[^1]。 ```java Integer c = 1000; Integer d = 1000; System.out.println(c.intValue() == d.intValue()); // true ``` #### 关于自动拆箱 当执行 `c == d` 时,如果 `c` 和 `d` 都是非空的 `Integer` 对象,Java 会尝试自动拆箱(Autounboxing),即将它们转换为基本类型 `int` 后再进行比较。然而,这种行为仅在某些情况下有效,具体取决于 JVM 的实现和缓存机制[^3]。 #### JVM 缓存机制的影响 JVM 内部对 `-128` 到 `127` 范围内的整数进行了缓存。在这个范围内的 `Integer` 对象会共享同一个实例,因此直接使用 `==` 比较引用时可能会返回 `true`。超出这个范围的 `Integer` 对象则不会共享实例,因此使用 `==` 比较时通常会返回 `false`[^4]。 ```java Integer x = 127; Integer y = 127; System.out.println(x == y); // true (因为缓存) Integer z = 128; Integer w = 128; System.out.println(z == w); // false (没有缓存) ``` #### 推荐的最佳实践 为了避免因缓存机制导致的意外行为,建议始终使用 `.equals()` 或 `.intValue()` 来比较 `Integer` 对象的值。这可以确保无论数值是否在缓存范围内,比较结果都是正确的。 ```java Integer a = 1000; Integer b = 1000; // 推荐方式 1 System.out.println(a.equals(b)); // true // 推荐方式 2 System.out.println(a.intValue() == b.intValue()); // true ``` ### 注意事项 - 如果可能涉及 `null` 值,需小心处理以避免 `NullPointerException`。例如,`a.equals(b)` 在 `a` 为 `null` 时会抛出异常。 - 在性能敏感的场景中,`.intValue()` 可能比 `.equals()` 更高效,因为它避免了方法调用开销。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值