因为看到几个很有意思的面试题,关于装箱拆箱的,错得一头雾水<img alt="敲打" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/knock.gif" />,就想着总结一下经验
首先对于自动装箱拆箱的定义,其实看这个你就明白了
Integer i=100;
被自动转换成
Integer i=Integer.valueOf(100);
就叫做自动装箱。而拆箱呢,比如:
<pre name="code" class="java">Integer i1=1;
Integer i2=2;
int i3=i1+i2;//包装器类型拆成基本数据类型完成算数运算
然后进入正题吧
String s1="asdf";
String s2="asdf";
s1==s2; (true)//除非是new一个String对象,否则只要是像这样隐式装箱,字符串内容相同,返回的都是同一个对象的引用。
s1.equals(s2); (true)
Integer i1=12;
Integer i2=12;
Integer i3=300;
Integer i4=300;
i1==i2; (true)
i1.equals(i2); (true)//仅在数值大于等于-128且小于等于127时,因为这种情况时装箱操作返回的是同一个缓存对象的引用
//而超过这个值以后每次返回的是新创建对象的引用,像这样有数据范围区别的基本类型还有Long(-128<=i<=127)
//Byte(-128<=i<=127) Short(-128<=i<=127) char(i<=127)(依然强调你不能超过它本身表示数据的范围)
i3==i4; (false)
i3.equals(i4); (true)
double float并不存在此种情况,这是由包装器类的valueOf方法决定的
Double d1=12.3;
Double d2=12.3;
d1==d2; (false) //无论值是什么都是这种结果 因为他们的valueOf每次都返回的新对象引用
d1.equals(d2); (true)
Boolean b1=true;
Boolean b2=true;
b1==b2; (true)
b1.equals(b2); (true)
Boolean的valueOf方法每次返回的都是缓存对象的引用,从不新建对象,所以地址都是相同的.<img alt="微笑" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif" />