装箱和拆箱和ValueOf以及XXXValue -- Java语法糖(Syntax sugar)_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 装箱和拆箱和ValueOf以及XXXValue -- Java语法糖(Syntax sugar)

装箱和拆箱和ValueOf以及XXXValue -- Java语法糖(Syntax sugar)

 2011/10/18 6:10:45  jilen  http://jilen.iteye.com  我要评论(0)
  • 摘要:自动装箱拆箱发生在基本类型和其包装型互操作的时候。以前一直不知的拆箱和装箱是valueOf和xxValue的别名。是语法糖的一种publicstaticvoidmain(String[]args){Integeri=10;Integerj=10;System.out.println(j==i);//(1)truei=10000;j=10000;System.out.println(j==i);//(2)falsei=newInteger(10000);System.out.println
  • 标签:Java

自动装箱拆箱发生在基本类型和其包装型互操作的时候。

以前一直不知的拆箱和装箱是valueOf和xxValue的别名。是语法糖的一种

?

?

public static void main(String[] args) {
		Integer i = 10;
		Integer j = 10;
		System.out.println(j == i); //(1) true

		i = 10000;
		j = 10000;
		System.out.println(j == i); //(2) false

		i = new Integer(10000);
		System.out.println(i == 10000); //(3) true
		System.out.println(10000 == i); //(4)  true
		System.out.println(i == 10000L);//(5) true

	}

?

?

(1)处的结果是 true。

(2)处的结果是false。

(3)处的结果是true,true,true

?

(1),(2)处的结果不同让人惊讶。i = 10;和i=10000;发生了自动装箱,编译器自动编译成 Integer.valueOf(10)和Integer.valueOf(10000)。看看这个方法的实现。

?

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

?

看到某些Integer对象是有缓存的,范围是-128,到high。

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

? ? high默认是127,可以通过integerCacheHighPropValue

调整,看看这个属性的说明

?

 /**
     * Cache to support the object identity semantics of autoboxing for values between 
     * -128 and 127 (inclusive) as required by JLS.
     *
     * The cache is initialized on first usage. During VM initialization the
     * getAndRemoveCacheProperties method may be used to get and remove any system
     * properites that configure the cache size. At this time, the size of the
     * cache may be controlled by the vm option -XX:AutoBoxCacheMax=<size>.
     */

    // value of java.lang.Integer.IntegerCache.high property (obtained during VM init)
    private static String integerCacheHighPropValue;

?可以通过该参数调整缓存的范围? -XX:AutoBoxCacheMax=<size>

?

3,4,5处发生拆箱,编译之后其实调用了intValue,或者longValue。获得的是基本类型。

?

?

总结: 两个包装类型的值比较,最好不要用 ==

?

发表评论
用户名: 匿名