Integer自动拆装箱

定义:

自动装箱:把基本类型用它们相对应的引用类型包装起来,使它们可以具有对象的特质,可以调用toString()、hashCode()、getClass()、equals()等等方法。

自动拆箱:跟装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为基本类型的数据。

自动装箱和自动拆箱其实是由编译器来完成的,编译器会在编译时期根据你所写的语法决定是否进行装箱和拆箱动作。

 

自动装箱

Integer a=3;//这是自动装箱

其实编译器调用的是static Integer valueOf(int i)这个方法,valueOf(inti)返回一个表示指定的int值的Integer对象

 

自动拆箱

int i = new Integer(2);//这是自动拆箱

编译器内部自动调用  int intValue()返回该Integer对象的int值

 

什么时候发生自动拆箱装箱

① 赋值的时候,比如:

              Integer i = 10; //装箱
              int t = i; //拆箱

② 运算的时候,比如:

         Integer i = 10;
              System.out.println(i++);  

另外,在参数传递中,可以对int对象传递Integer,也可以对Integer对象传递int

 

Integer的缓存

 

1、先来看一组测试代码

              Integer int1 = new Integer("111");                    //创建一个Integer对象

              Integer int2 = new Integer("111");                    //创建一个Integer对象

              System.out.println(int1 == int2);                  //false     ==比较的是地址,因为是两个Integer对象,虽然内容相同,但是地址不同

              System.out.println(int1.equals(int2));             //true      equals()比较内容

              System.out.println(int1.compareTo(int2));      //0          compareTo()比较内容

 

              Integer int3 = new Integer("131");                    //同上

              Integer int4 = new Integer("131");                    //同上

              System.out.println(int3 == int4);                  //false

              System.out.println(int3.equals(int4));             //true

              System.out.println(int3.compareTo(int4));      //0

 

              Integer int5 = 111;                                      //自动装箱

              Integer int6 = 111;                                      //自动装箱

              System.out.println(int5 == int6);                  //true,调用了Integer的cache

              System.out.println(int5.equals(int6));             //ture

              System.out.println(int5.compareTo(int6));      //0

 

              Integer int7 = 131;                                      //自动装箱

              Integer int8 = 131;                                      //自动装箱

              System.out.println(int7 == int8);                  //false

              System.out.println(int7.equals(int8));             //true

              System.out.println(int7.compareTo(int8));      //0

              System.out.println();

 

2、结论:

① ==比较的是地址,equals和compareTo比较的是内容

② 如果使用了自动装箱机制,而且int的值x在-128~128(默认)的范围内,无论生成多少个Integer对象,都是返回cache中的同一个Integer(x)对象

③ 如果使用自动装箱,但是int值x不在这个默认范围内,则会new Integer(x),因此会产生不同

 

3、IntegerCache

会默认生成256个Integer对象供使用,默认范围是-128~128

其中下限-128是指定了的,不可修改

上限128可以修改

可以通过调整虚拟机-XX:AutoBoxCacheMax=<size>选项,调整“自动装箱池”的大小

使用Oracle/SunJDK 6,在server模式下,使用-XX:AutoBoxCacheMax=NNN参数即可将Integer的自动缓存区间设置为[-128,NNN]。这个参数是server模式专有的。

 

怎么切换成server模式

虚拟机版本与模式查看: 
         java -version                      //查看JVM默认的环境 
         java -client -version           //查看JVM的客户端环境,针对GUI优化,启动速度快,运行速度不如server 
         java -server -version          //查看JVM的服务器端环境,针对生产环境优化,运行速度快,启动速度慢

切换方法如下:

        找到JAVA_HOME/jre/lib/i386/jvm.cfg,这就是JVM默认的查找顺序,内容如下 
        -client KNOWN 
        -server KNOWN 
        -hotspot ALIASED_TO -client 
        -classic WARN 
        -native ERROR 
        -green ERROR 
       只需要把-server和-clent换个位置就行了.如下 
       -server KNOWN 
       -client KNOWN 
       -hotspot ALIASED_TO -client 
       -classic WARN 
       -native ERROR 
       -green ERROR

 

posted on 2013-05-11 15:46  melburg  阅读(454)  评论(1)    收藏  举报