java Integer 的问题

毛蚕 发布于 2013/09/03 17:31
阅读 664
收藏 0
Integer i = 8,j = 8;

Integer ii = 280,jj = 280;

if(i == j)
System.out.println("i=j");
if(ii == jj)
System.out.println("ii=jj");

为什么i=j但ii!=jj呢,好像是java自动缓存了8位的值什么的? 谁能讲详细点哈 谢谢了。



加载中
0
逝水fox
逝水fox
你看看这个类valueOf()方法的源代码吧
逝水fox
逝水fox
回复 @专业打酱油 : 这东西只是编译器的行为,所以最简单的办法,把编译后的class文件反编译,就知道他自动装箱是怎么实现的了。
专业打酱油
专业打酱油
我想问问,通过什么判断的是ValueOf(),是经验还是某规范?
0
Sam_Su
Sam_Su

装箱后比较的是引用而非值,所以不一定保证两个相同的数"==".

但第一个一定返回true,是因为虚拟机会缓存-128到127之间的数的值.

0
ArrayListt
ArrayListt

Integer的值。好像在一个数字段里面会有缓存,用==会直接返回true。

楼上的答案是正确的。

我记得我在iteye里面也看过这个问题

0
Monkey
Monkey
常量类型都是只有一个变量,不管多少人引用都是一个。String有点不一样。
0
南湖船老大
南湖船老大
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));
            }
            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() {}
    }

    /**
     * Returns an {@code Integer} instance representing the specified
     * {@code int} value.  If a new {@code Integer} instance is not
     * required, this method should generally be used in preference to
     * the constructor {@link #Integer(int)}, as this method is likely
     * to yield significantly better space and time performance by
     * caching frequently requested values.
     *
     * This method will always cache values in the range -128 to 127,
     * inclusive, and may cache other values outside of this range.
     *
     * @param  i an {@code int} value.
     * @return an {@code Integer} instance representing {@code i}.
     * @since  1.5
     */
    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);
    }
zwjhuhu
zwjhuhu
嗯,缓存的是IntegerCache中low到high的范围。
0
酷酷的就
酷酷的就
首先==比较的是内存地址; 这里jvm在启动的时候会在内存中缓冲很多常用变量,其中包括整形的 -128到127(好像是),还有单字母,还有其他一些变量(记不清), 所以如你看到的.
0
王正航
王正航
这个是jdk1.5里面的自动拆箱和封箱的功能,给大家一篇参考文章http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html,这有篇中文的http://wenku.baidu.com/view/6deb37274b35eefdc8d33339.html
0
汉唐
汉唐
LS说的对,虚拟机默认是缓存了-128到127.然后这个是可以指定的,在启动虚拟机的时候指定参数即可。
0
毛蚕
毛蚕
非常感谢楼上的各位
返回顶部
顶部