Integer类型的比较

这篇博客探讨了Java中Integer对象的缓存特性,指出在-128到127之间的Integer对象会使用缓存,导致相等比较返回true。当数值超出此范围时,new操作会导致不同的对象实例,进而使得==比较返回false,而equals方法仍然返回true。
Integer类型的易错面试题:
Integer在类加载的时候已经缓存了-128-127大小的数据,所以i==j;i1和j1因为不在缓存范围,相当于重新new了两个数据,所以i1,j1的==比较为false。

public class ForTest {
    public static void main(String[] args) {
        Integer i = 127;
        Integer j = 127;
        System.out.println(j == i);

        System.out.println("==============");

        Integer i1 = 128;
        Integer j1 = 128;
        System.out.println(j1 == i1);
        System.out.println(j1.equals(i1));

        System.out.println("==============");
        Integer i2 = 128;
        System.out.println(i2 == 128);
    }
}

 

### 如何正确比较 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()` 更高效,因为它避免了方法调用开销。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值