自动装箱的疑惑(jdk1.5中自动装/折箱的新特性)

今天在论坛里看到这样一个题目

         int  k  =   100 ;
        Integer int1 
=  Integer.valueOf(k);
        Integer int2 
=  Integer.valueOf(k);       
        System.out.println(
" a. "   +  (int1  ==  int2)); // true
        k  =   200 ;
        Integer int3 
=  k; 
        Integer int4 
=  k;
        System.out.println(
" b. "   +  (int3  ==  int4)); // false
         char  c  =   ' A ' ;
        Character char1 
=  c;
        Character char2 
=  c;
        System.out.println(
" c. "   +  (char1  ==  char2)); // true
        c  =   ' ' ;
        Character char3 
=  c;
        Character char4 
=  c;
        System.out.println(
" d. "   +  (char3  ==  char4)); // false

 问结果是什么.答案我都写在了后面.

对于Integer int1 = Integer.valueOf(k);

这句我们都知道是jdk1.5加上的自动装折箱功能.也就是自动的进行原始类和其封装类的互转.

可是后面的int1 == int2返回true而同样的方法int3 == int4返回false就让人想不通了.

最后还是看了jdk的源码才明白过来

valueOf()的源码:

    public   static  Integer valueOf( int  i)  {
    
final int offset = 128;
    
if (i >= -128 && i <= 127// must cache 
        return IntegerCache.cache[i + offset];
    }

        
return new Integer(i);
    }

它对大小是byte(-128-127)做了处理,它是从IntegerCache初始化的256个Integer缓存中取.

这样就只有一个对象当然就是true了,而后面的200超出了这个范围就是用new Integer(i)产生了一个新的对象,返回就是false了.

你可能感兴趣的:(自动装箱的疑惑(jdk1.5中自动装/折箱的新特性))