今天看java JDK7的新特新语法糖的时候突然有提到装箱与拆箱,就特地加深一下:
所谓装箱:就是在代码编译期将基本类型转化为包装类型,使其基本有类型具有对象特征
所谓拆箱:与装箱过程相反,就是把包装类型转为基本类型
自动装箱/拆箱 就是代码在编译根据代码的语法,决定是否装箱或者拆箱!
一:先说说equals()和== 号的区别吧!
Integer,short的自动装箱:
Integer a = -129; //超出-128
Integer b = -129;
Integer c=1;
Integer d=1;
System.out.println(c==d);
System.out.println(a==b);
输出结果为:false,true。也就是说:
1:自动装箱针对于值-128~127之间,他们被装箱后会在内存中被重用!如果超过了这个区间那么就不会被重用,也就相当于每次新建一个Integer 的对象!
再来说说equals()和== 号的区别吧:
Integer a = -129;
Integer b = -129;
System.out.println(a.equals(b));
System.out.println(a==b); //地址未被重用
输出结果为:true false
说明:
equals() 比较的是两个对象的值(内容)是否相同。
"==" 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。
String、的装箱与拆箱 String str1 = "abc";
String str2 = "abc";
System.out.println(str2==str1); //输出为 true
System.out.println(str2.equals(str1)); //输出为 true
String str3 = new String("abc");
String str4 = new String("abc");
System.out.println(str3==str4); //输出为 false
System.out.println(str3.equals(str4)); //输出为 true
可以看出来 str1 str2引用的是同一对象,str3 str4却是俩个不同的对象
注意:Integer i=3; 事实上调用的Integer.valueOf(int i); 装箱是Integer.valueOf(int i),那么拆箱是:i.intValue()!
需要注意的是:
包装类型的“==”运算在没有遇到算数运算符的情况下不会自动拆箱,而其包装类型的equals()方法不会处理数据类型转换,所以:
Integer a = 1;
Integer b = 1;
Long c = 1L;
System.out.println(a == b);
System.out.println(c.equals(a));
这样的代码是有误区的, 根本不会实现拆装箱的操作!
这样的代码应该尽量避免自动拆箱与装箱。