`
luhantu
  • 浏览: 201408 次
  • 性别: 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二进制操作,所有进制转换)

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

    Java Integer的缓存特性

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

    Java中Integer两种转int方法比较

    本文主要介绍了Java Integer两种转int方法比较。具有很好的参考价值,下面跟着小编一起来看下吧

    JAVA-int和Integer的区别1.zip

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

    JAVA-int和Integer的区别

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

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

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

    JAVA中的integer的一些见解

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

    javaInteger大数据运算.pdf

    javaInteger⼤数据运算 ⼤数据运算 package com.oracle.demo01; import java.math.BigDecimal; import java.math.BigInteger; public class DemoInteger{ public static void main(String[] args) { //四则运算:...

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

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

    Java int与integer的对比区别

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

    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时,...

    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