关于Integer的"=="

本文深入探讨Java中Integer类的内部实现机制,特别是自动装箱如何将基本类型转换为包装类实例,以及在特定范围内如何通过缓存优化性能。文章详细解释了IntegerCache的作用和原理,帮助开发者理解Java内存管理和性能优化的关键点。
public static void main(String []args) {
		Integer a = 1;
		Integer b = 1;
		Integer c = 200;
		Integer d = 200;
		System.out.println(a == b);
		System.out.println(c == d);
	}


输出结果:

true

false

使用1或者1000赋值给Integer时,Java会翻译为Integer.valueof(xxx),附上源码,在-128到127之间的时候直接return IntegerCache.cahe[]了,因此出现了这个结果

    private static class IntegerCache {
        static final int high;
        static final Integer cache[];

        static {
            final int low = -128;

            // high value may be configured by property
            int h = 127;
            if (integerCacheHighPropValue != null) {
                // Use Long.decode here to avoid invoking methods that
                // require Integer's autoboxing cache to be initialized
                int i = Long.decode(integerCacheHighPropValue).intValue();
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - -low);
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }

        private IntegerCache() {}
    }

    /**
     * Returns a <tt>Integer</tt> instance representing the specified
     * <tt>int</tt> value.
     * If a new <tt>Integer</tt> instance is not required, this method
     * should generally be used in preference to the constructor
     * {@link #Integer(int)}, as this method is likely to yield
     * significantly better space and time performance by caching
     * frequently requested values.
     *
     * @param  i an <code>int</code> value.
     * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
     * @since  1.5
     */
    public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }


### 三、Integer 与 int 的比较机制 在 Java 中,`Integer` 是 `int` 的包装类,用于将基本数据类型封装为对象。在进行条件判断时,尤其是使用 `==` 运算符进行比较时,`Integer` 和 `int` 的行为存在显著差异,主要体现在类型转换机制和缓存机制上。 当 `Integer` 与 `int` 使用 `==` 进行比较时,`Integer` 会自动拆箱为 `int` 类型,因此最终比较的是两个基本类型的值,而不是对象的引用地址。这种自动拆箱机制确保了即使 `Integer` 是通过 `new` 创建的对象,也能与 `int` 进行值的比较[^2]。 然而,当两个 `Integer` 对象使用 `==` 进行比较时,情况则有所不同。`==` 在这种情况下比较的是对象的引用地址,而不是它们所包含的值。Java 为了优化性能,对 `Integer` 类型的值在 -128 到 127 之间进行了缓存。这意味着在这个范围内的 `Integer` 实例会被重用,因此使用 `==` 比较这些值时可能返回 `true`;而超出该范围的值则会创建新的对象,导致 `==` 比较结果为 `false`。这种行为被称为“Integer 128 陷阱”[^1]。 ### 三、代码示例 以下是一些示例代码,展示了 `Integer` 和 `int` 在不同比较场景下的行为: ```java Integer a = 127; Integer b = 127; System.out.println(a == b); // true,因为值在缓存范围内,且使用自动装箱 Integer c = 128; Integer d = 128; System.out.println(c == d); // false,因为值超出缓存范围,每次都会创建新对象 Integer e = new Integer(127); Integer f = new Integer(127); System.out.println(e == f); // false,因为是两个不同的对象实例 int g = 127; System.out.println(e == g); // true,因为 e 会自动拆箱为 int ``` ### 三、最佳实践 为了避免由于 `Integer` 缓存机制和 `==` 比较行为带来的潜在问题,建议在需要比较数值的情况下使用 `equals()` 方法,而不是 `==`。`equals()` 方法会比较对象的实际值,而不是引用地址,且 `Integer` 类已经重写了 `equals()` 方法以支持这种比较[^3]。 ```java Integer h = 128; Integer i = 128; System.out.println(h.equals(i)); // true,比较的是值,而不是引用 ``` 此外,在处理可能为 `null` 的 `Integer` 对象时,应特别小心,因为调用 `equals()` 方法时如果对象为 `null` 会抛出 `NullPointerException`。此时,可以使用 `==` 来安全地判断 `null` 值[^4]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值