Integer 大小比较遇到过的坑

来源:互联网 发布:学规范知礼仪的手抄报 编辑:程序博客网 时间:2024/05/21 17:07

今天帮人解答了一个Integer 比较的问题,发现坑很多,总结一下遇到过的坑,没什么技术含量,只是为了记录一下,避免入坑。
先看如下几个例子,心里想一下比较结果,我会在下面分别解析公布答案。

        int a1 = 10;        Integer b1 = new Integer(10);        System.out.println(a1== b1);     //Line 15        Integer a2 = 127;        Integer b2 = 127;        System.out.println(a2==b2);     //Line 19        Integer a3 = 128;        Integer b3 = 128;        System.out.println(a3 == b3);   //Line 23        Integer a4 = new Integer(10);        Integer b4 = new Integer(10);        System.out.println(a4==b4);     //Line 27

解析

Line 15 输出true

这里从结果上看应该是b1隐式类型转换为int了,所以比较结果就是ture,可以看一下byteCode分析:

LINENUMBER 15 L1GETSTATIC java/lang/System.out : Ljava/io/PrintStream;BIPUSH 10ALOAD 1INVOKEVIRTUAL java/lang/Integer.intValue ()IIF_ICMPNE L2ICONST_1GOTO L3

可以看到,第15行其实是b1.intValue()然后在做了比较。

Line 19 输出true

这是因为Integer对小整数做了缓存,也就是说其实a2,b2指向了Integer的缓存,并不是比较的内存地址,详见java.lang.Integer.IntegerCache.
代码如下:

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) {            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);        }        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() {}}

Line 23 输出False

Line 19的例子中其实已经有解释了,IntegerCache的范围是-128~127所以128就没有缓存了,a3,b3是实例化出来后赋值的,所以比较的就是两个变量的内存地址。

Line 27 输出false

这个没有什么争议,如果这个你都能答错,建议重新补充一下基础。其实这个是跟Line 23一样的,而且这个写的更名想,实例化两个Integer,直接比较的话就是比较的是两个内存地址,他们hashCode也是不同的,比较他们的值,需要用a4.equal(b4)来比较

最后

  • 可以思考一下如下代码,这个后面有空可以一起讨论一下
String a5 = "10";String b5 = "10";String c5 = new String("10");System.out.println(a5 == b5);   //trueSystem.out.println(a5 == c5);   //false

关于我

  • @Author:Zemo
  • @Email:zemochen#126.com
  • J2EE 两年多研发经验,日常公司打杂,处于迷茫期
  • 欢迎转载,让更多的人学到东西
0 0