`
luhantu
  • 浏览: 204485 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java Integer 比较

    博客分类:
  • Java
阅读更多

 

public class Test {  
  
    public static void main(String[] args) {  
        int a = 1;  
        int b = 1;  
        Integer c = 3;  
        Integer d = 3;  
        Integer e = 321;  
        Integer f = 321;  
  
        System.out.println(a == b);  
        System.out.println(c == d);  
        System.out.println(e == f);  
  
    }  
}  
output:  
true  
true  
false  

 看到这个结果,一定非常的奇怪,为什么会出现这种情况。

 

原因就在Integer的方法 valueOf()方法。

public static Integer valueOf(int i) {  
        if(i >= -128 && i <= IntegerCache.high)  
            return IntegerCache.cache[i + 128];  
        else  
            return new Integer(i);  
    }  
  
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() {}  
    }  

 Integer里弄了一个缓存,对于在 -128—127 之间的数值,会直接使用该缓存里的对象  

 也就是说 Integer c = 3 或者 Integer c = Integer.valueOf(3) ,最终 c 得到的是Integer里的缓存对象  

 同理,d也是获得该相同对象因此 进行 c == d 比较时,c和d引用的是同一个对象,因此就true  

 而对于321,已经超出缓存范围了,因此 valueOf 方法会生成一个新的Integer对象因此e和f就引用不同 的对象了,进行==比较,当然就false了  

 另外,对Integer的缓存,我们在日常开发时,对于小的整型值应该充分利用Integer的缓存对象省去过多的对象创建,回收的操作,这样会极大的提高程序性能  。

所以如果想比较连个Integer 对象的值是否相等,可以equals()或者compareTo(),或者intValue()去比较。

参考文章:http://blog.csdn.net/zhoumingp/article/details/8298566

分享到:
评论

相关推荐

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

    JAVA 中的 Integer 比较 在 Java 中,我们经常需要比较两个 Integer 对象是否相等,但是在使用 "==" 运算符时,可能会出现一些意外的结果。本文将深入探讨 Java 中的 Integer 比较,了解为什么使用 "==" 运算符可能...

    JAVA Integer类型自加实例详解

    JAVA Integer类型自加实例详解 JAVA Integer类型自加实例详解是 Java 语言中一个非常重要的知识点,对于 Java 开发者来说,无论是初学者还是高级开发者 都需要了解和掌握这方面的知识。本文将深入探讨 Java Integer...

    HugeInteger.java

    HugeInteger.java

    Java Integer的缓存特性

    项目里遇到的小问题的 整理

    Java中Integer两种转int方法比较

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

    Java8 将List<Integer> 转换成以逗号分割的String字符串

    在Java编程中,将一个`List&lt;Integer&gt;`转换成以逗号分隔的`String`字符串是一种常见的需求,尤其是在处理数据展示或格式化输出时。Java 8引入了新的特性和方法,使得这种转换变得更加简洁和高效。下面我们将深入探讨...

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

    ### Java中Long与Integer比较易犯错误总结 #### 一、引言 在Java编程过程中,经常需要对数值进行比较操作。对于基本数据类型如`int`和`long`,可以直接使用`==`进行比较。然而,当涉及到它们的包装类`Integer`和`...

    JAVA-int和Integer的区别1.zip

    在Java编程语言中,`int`和`Integer`都是用于表示整数值的数据类型,但它们之间存在着显著的差异。理解这些区别对于编写高效且优化的Java代码至关重要。 首先,`int`是Java中的原始数据类型之一,它直接存储在栈...

    JAVA-int和Integer的区别

    需要注意的是,当进行`Integer`之间的比较时,如果值在-128到127之间,Java会使用缓存来提高性能,因此比较速度较快。但超出这个范围,每个`Integer`对象都是独一无二的,即使值相同,`==`比较也会返回`false`,此时...

    JAVA中的integer的一些见解

    对JAVA中的int类型和integer类型进行透彻分析的一个文档 很有帮助的哦 亲!

    Java int与integer的对比区别

    6. **比较**:对于 `int`,可以直接使用 `==` 进行值的比较,而对于 `Integer`,必须使用 `.equals()` 方法,除非进行的是对象引用的比较。 7. **缓存**:`Integer` 类有一个内置的缓存,用于存储-128到127之间的值...

    java中Integer包装类的详细讲解(java二进制操作,所有进制转换)

    java中Integer包装类的详细讲解(java二进制操作,所有进制转换) 十进制转成二进制 十进制转八进制 十进制转十六进制 十六进制转成十进制 十六进制转成二进制 八进制转成十进制 等等所有进制转换和操作

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

    在Java中,享元模式在Integer和String类中有显著的应用。 首先,我们来看Integer类。在Java中,基本数据类型int的封装类是Integer。在某些情况下,我们可能需要将int转换为Integer对象,这个过程称为自动装箱。反之...

    通过实例了解Java Integer类和int的区别

    知识点3:Integer比较 在比较两个Integer对象时,我们应该使用equals()方法,而不是==操作符,这是因为==操作符比较的是对象的地址,而不是对象的值。 知识点4:int和Integer的比较 在比较int和Integer时,...

    java-leetcode题解之Integer Break.java

    java java_leetcode题解之Integer Break.java

    Integer创建对象

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

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

    在Java编程语言中,`Long` 和 `Integer` 是两种包装类型,用于封装基本类型 `long` 和 `int` 的值。在处理这些包装类型时,开发者常常会遇到一些常见错误,尤其是涉及到对象比较的时候。以下是一些关于 `Long` 和 `...

    simple compare integer in java

    simple to compare two integer in java

    Java中int和Integer的区别.doc.doc

    Java 中 int 和 Integer 的区别 在 Java 编程语言中,int 和 Integer 是两种不同的数据类型,虽然它们看起来很相似,但它们有着根本的区别。下面我们将详细探讨这两种数据类型的差异。 基本类型 vs 复杂数据类型 ...

Global site tag (gtag.js) - Google Analytics