Java基础__Integer类型中的自动装箱

 

 

  Integer类型的自动装箱:就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。因为这里的装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱。 

 

 

 

package Text;

public class Gary {
       public static void main(String[] args) {
            //true
            Integer a1 = 127, b1 = 127;
            System.out.println(a1==b1);
            //false
            Integer a2 = new Integer(127);  
            Integer b2 = new Integer(127);  
            System.out.println(a2 == b2);   
            //false
            Integer a3=128, b3 = 128;
            System.out.println(a3==b3);
            //true
            Integer a4=128, b4 = 128;
            System.out.println(a4.equals(b4));
        }
}
Gary.java

 

  注意点:"=="可以用于原始值进行比较,也可以用于对象进行比较,当用于对象与对象之间比较时,比较的不是对象代表的值,而是检查两个对象是否是同一对象,这个比较过程中没有自动装箱发生。进行对象值比较不应该使用”==“,而应该使用对象对应的equals方法

 

原因分析:

  第一个使用"=="判断 Integer a1 = 127 和 Integer  b1 = 127

  相等原因:Integer的取值范围是-128~127

 

  第二个使用"=="判断Integer a2 = new Integer(127) 和 Integer b2 = new Integer(127)

  不相等原因:装箱时,java为了提高效率,IntegerCache类中有一个数组将-128<=i<=127范围之内的数据打包成缓存里的Integer对象了,因此不用new,这个区间里的值用直接=赋值方法得到的变量地址就是同一个,而超出这个范围的数值就会new一个Integer对象出来

 

  第三个使用"=="判断Integer a3=128 和 Integer  b3 = 128

  不相等原因:因为Integer类型赋值范围在-128---127之间,超出这个范围的数值就会重新new一个Integer对象出来,直接用==去比较是比较a3和b3的地址,a3和b3的地址是不相等的

 

  第四个使用使用"=="equals()方法判断Integer a4=128 和 Integer b4 = 128

  相等原因:使用equals()方法比较的是a4和b4的数值

 

  Java自动装箱的优点:对-128到127的Integer对象进行缓存,当创建新的Integer对象时,如果符合这个这个范围,并且已有存在的相同值的对象,则返回这个对象(地址),不需要再创建一个新的Integer对象,否则创建新的Integer对象

 

  Java自动装箱的缺点:因为自动装箱会隐式地创建对象,像前面提到的那样,如果在一个循环体中,会创建无用的中间对象,这样会增加GC压力,拉低程序的性能。所以在写循环时一定要注意代码,避免引入不必要的自动装箱操作

 

 

 

posted @ 2018-03-13 00:01  Cynical丶Gary  阅读(291)  评论(0编辑  收藏  举报