我是靠谱客的博主 野性绿草,最近开发中收集的这篇文章主要介绍Integer的数值比较,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

       jpa自动代码生成的时候。mysql数据库设为int(11)的字段会生成private Integer num这样的vo类。在比较num1==num2的时候。当-129<num1=num2<128的时候,num1==num2结果为true。但是当num1和num2不在区间[-128,127]里面的时候。num1==num2结果为false。

            造成这一切的原因是Integer自动装箱的问题。下面上源码:

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

以下是IntegerCache的low和high值来源

     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++);
        }

可以看到的是。low的值为-128.high的值一般为127。在自动装箱的时候。如果num为[-128,127]区间的值。是从缓存里面拿的同一个Integer对象。但是不在此区间的时候new 一个Integer对象。==比较的是对象的hash地址。如果是两个对象==。肯定是false啦。

    自己被坑了一次,记录下来。

    

最后

以上就是野性绿草为你收集整理的Integer的数值比较的全部内容,希望文章能够帮你解决Integer的数值比较所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部