`

Integer对象的值比较

 
阅读更多

1.Integer a = n ;Integer b = new Integer(n),a一定不等于b

2.两个都是new出来的,肯定不等

3.int与以上两种Integer对象比,只要值一样就相等(自动拆装箱)

 

有意思的来了,如果两个都是非new方法新建的对象,那么值在-128至127之间,则是相等,否则不等

什么意思呢

Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1==i2);  //true
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3==i4);  //false

 

为什么会这样呢?

Java在编译Integer i1 = 127的时候会翻译成 Integer i1 = Integer.valueOf(127);

 

查看源码:Integer的valueOf方法

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

 

这个IntegerCache是Integer的一个内部类如下:

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

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

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

 大致就是一个大小为127-(-128)+1的一个数组,数组中存的是值为-128到127的Integer对象。而valueOf方法就是判断当值在-128~127之间时返回数组中对应值的Integer对象,否则就新建对象并返回,所以当值在-128~127之间时新对象指向IntegerCache数组中的对象,两个值相同的新对象指向的也是同一个对象,当然相等

分享到:
评论

相关推荐

    JAVA Integer == equal 比较 doc 比较大小 是否相等

    因此,当我们使用 "==" 运算符来比较两个 Integer 对象时,实际上是在比较这两个对象的引用是否相同,而不是比较它们的实际值。 例如,在下面的代码中: ```java Integer i1 = 100; Integer i2 = 100; if (i1 == i2...

    Integer创建对象

    在这种情况下,Java会进行拆箱操作,即将`Integer`对象转换为其对应的`int`值,然后进行数值比较。由于`i2`和`i3`(或者`i5`和`i6`)的值相加后结果仍然是40,且40在对象池范围内,所以这些表达式的结果为`true`。 ...

    Integer缓存池案例1

    当我们在程序中创建Integer对象时,如果值在-128到127之间,Integer对象会直接从缓存池中获取或复用已存在的对象,避免了重复创建。这是因为Java的自动装箱拆箱机制,使得Integer和int之间的转换更加便捷,但同时也...

    义一个整数集合类integerSet。这种类型的对象可以存储10个20~80之间的整数,即他的内部有一个整型数组存储数据。编程:

    2. 创建`integerSet`对象`d`,并调用`bool`、`jiao`、`bing`和`delete`方法,实现集合的比较、交集、并集以及删除操作。 通过以上分析可以看出,`integerSet`类实现了基本的集合操作,包括比较、交集、并集及删除等...

    mybatis返回Integer

    这是因为Integer对象提供了更丰富的功能,比如比较操作、null安全的方法等。此外,Integer还兼容Java的自动装箱和拆箱机制,使得代码更加简洁。 例如,以下是一个使用Integer作为返回值类型的MyBatis示例: ```xml...

    值引用与对象引用

    ### 值引用与对象引用 #### 一、引言 在编程中,变量的引用方式分为两大类:值引用(Value Reference)和对象引用(Object Reference)。这两种引用方式决定了程序如何处理数据以及数据的存储方式。理解这些概念...

    JAVA-int和Integer的区别

    但超出这个范围,每个`Integer`对象都是独一无二的,即使值相同,`==`比较也会返回`false`,此时应使用`.equals()`方法进行值的比较。 此外,`Integer`类还提供了一些实用方法,比如`parseInt()`用于将字符串转换为...

    Integer类的使用方法

    // 创建一个值为1234的Integer对象 ``` #### 3. 方法概览 `Integer`类提供了一系列的方法来操作和转换整数值: - **转换方法**:如`parseInt(String s)`用于将字符串转换为整数,`toString(int i)`用于将整数...

    JAVA-int和Integer的区别1.zip

    而对于`Integer`,如果比较的是对象引用而不是值,需要使用`equals()`方法,例如`Integer a = 5; Integer b = 5; System.out.println(a.equals(b));`会输出`true`。如果比较的是数值,可以使用`compareTo()`方法,...

    55丨享元模式(下):剖析享元模式在JavaInteger、String中的应用1

    相比之下,如果创建的Integer对象值在-128到127范围之外,如`Integer i3 = 129; Integer i4 = 129;`,则不会复用缓存池中的对象,而是每次都会创建新的实例。因此,`i3 == i4`会返回false,因为它们引用的是两个不同...

    java对象比较器

    这个比较器能够处理不同类型的对象:字符串(`String`)、整型(`Integer`)、布尔型(`Boolean`)以及一个名为`Person`的自定义类。 #### 2. `Comparator`接口 在Java中,`java.util.Comparator`是一个功能接口,...

    bigdecimal转integer.docx

    在某些情况下,我们可能需要将 `BigDecimal` 对象转换为 `Integer` 对象。本文将详细介绍三种将 `BigDecimal` 转换为 `Integer` 的方法。 1. 使用 `intValue()` 方法 `intValue()` 方法是最直接的转换方式,它会...

    JAVA中Integer值的范围实例代码

    这个方法用于将整数值转换为 `Integer` 对象。如果整数值在-128 到 127 之间,就会从缓存中取出对应的对象;否则,就创建一个新的 `Integer` 对象。 现在,让我们来看一看 `IntegerCache` 类: ```java private ...

    Java对象的比较方式.doc

    这个方法接收一个对象参数,然后根据类的自然顺序返回一个整数值:如果当前对象小于传入的对象,返回负数;如果两者相等,返回0;如果当前对象大于传入的对象,返回正数。这样,通过调用`Collections.sort()`或`...

    Integer和int的不同

    在Java编程语言中,`Integer`和`int`是两...总结来说,`Integer`和`int`在用途、默认值和内存管理上有显著区别,`==`和`equals()`则分别用于比较对象的引用和内容。理解这些基本概念对于编写高质量的Java代码至关重要。

    Java中Integer两种转int方法比较

    这个方法通常在你需要使用`Integer`对象的特性(如缓存、比较操作或泛型方法参数)时使用。 在面试或笔试题中,如题目所示,`a = Integer.parseInt("123")`会将字符串"123"解析为`int`类型的值,并赋给变量a,所以a...

    细数java中Long与Integer比较容易犯的错误总结.docx

    使用`equals`方法可以比较两个`Long`或`Integer`对象的实际值是否相等。 ```java boolean isEqual = a.equals(b); ``` 2. **调用基本类型的转换方法**: 如果希望使用`==`来进行比较,可以先将对象转换为基本...

    第7讲 int和Integer有什么区别1

    查看`Integer`的源码可以帮助我们更深入地理解其内部机制,比如`Integer.valueOf()`方法如何实现值缓存,以及`Integer`对象的比较操作是如何进行的。 6. **扩展讨论**: - 自动装箱/拆箱发生的时间:这些操作发生...

    src02 Integer

    16. **compareTo(Integer a)**: 实现`Comparable&lt;Integer&gt;`接口的`compareTo()`方法,用于比较当前`Integer`对象与另一个`Integer`对象`a`的值。如果当前值大于、等于或小于`a`,则返回正数、零或负数。 这些方法和...

    Integer IntegerCache源码阅读

    这解释了为何在示例代码中,当我们将128或更大的整数值转换为 `Integer` 时,比较结果为 `false`,因为它们不会使用缓存,而是每次创建新对象。而对于-127到127之间的整数,由于使用了缓存,相同的值会返回同一个...

Global site tag (gtag.js) - Google Analytics