Java中的AutoBoxing (Integer对-128~127之间数值的特殊处理)

来源:互联网 发布:画工程图用什么软件 编辑:程序博客网 时间:2024/06/12 19:20

理解Java中Integer和int的Autoboxing,有助于java新手理解java内存机制。

在Java中的,Integer和int是可以Autoboxing和boxing的,这里要注意的是:在 int自动装箱成Integer的过程中,如果数值是在-128~127之间的值的话,那么会在在内存中供重用,用语句说明如下:

<pre name="code" class="java">//i1 and i2 is in the range of -128~127, while i3 and i4 not.   Integer i1 = 102;   Integer i2 = 102;   Integer i3 = 232;   Integer i4 = 232;   //compare the i1 whit i2   if(i1 == i2)        System.out.print("i1 == i2");   else                System.out.println("i1 != i2");   //compare the i3 whit i4   if(i3 == i4)        System.out.print("i3 == i4");   else         System.out.println("i3 != i4");  //输 出的结果便是i1 == i2   i3 != i4
<span style="color: rgb(34, 34, 34); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; line-height: 22.1px;">valueOf会将常用的值(-128 to 127)cache起来。当i值在这个范围时,会比用构造方法Integer(int)效率和空间上更好。Long也是</span>  

当然,看这段代码的时候,要明白“==”的用法。

另外要注意的一点的是,在不涉及Autoboxing的时候,Integer数值没有以上所述的特性如:还是以上的代码,只是在创建Integer对象的时候不同,

Integer i1 = new Integer(102);   Integer i2 = new Integer(102);   Integer i3 = new Integer(232);   Integer i4 = new Integer(232);  //此时,输出的结果是:i1 != i2   i3 != i4  
这 里再指明的一点是关于equals方法的,这个方法用在这里就可以避免Integer类的这种特殊处理,将以上代码中的if语句的改一下:

if(i1 == i2) 可以改成 if( i1.equals(i2) ) ,就可以了。

补充的是:equals()的原型是:

public boolean equals(Object obj)   {           return (this == obj);   }  
那 这个if(i1 == i2) 和 if( i1.equals(i2) )不是异曲同工了吗?

不是的,Integer中已经对这个方法作了重载:

public boolean equals(Object obj) {   if (obj instanceof Integer) {           return value == ((Integer)obj).intValue();   }   return false;   }  






0 0
原创粉丝点击