Integer 比较遇到过的坑

今天帮人解答了一个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 L1
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
BIPUSH 10
ALOAD 1
INVOKEVIRTUAL java/lang/Integer.intValue ()I
IF_ICMPNE L2
ICONST_1
GOTO 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);   //true
System.out.println(a5 == c5);   //false

关于我

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

转载于:https://my.oschina.net/zemochen/blog/685636

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值