Java装箱与拆箱
@Mackyhuang
首先需要认识的是primitive type和Object
- primitive type : int long double
- object : Integer Long Double
装箱
Integer i = 6;
- 这就是装箱的操作,把一个6装进一个Integer的箱子里面,然后把i指向了这个箱子。
Integer i = new Integer(6);
- 创建对象的方法把6通过构造方法装入Integer对象i
拆箱
int unbox = i.intValue();
用一段代码看看把!
调试代码:
public static void main(String[] args) {
boolean res1 = new Integer(6) == 6;
boolean res2 = new Integer(6) == new Integer(6);
boolean res3 = Integer.valueOf(6) == Integer.valueOf(6);
boolean res4 = Integer.valueOf(6).intValue() == 6;
boolean res5 = new Integer(6).equals(new Integer(6));
System.out.println(res1);
System.out.println(res2);
System.out.println(res3);
System.out.println(res4);
System.out.println(res5);
}
答案:
true
false
true
true
true
- new Integer(6) == 6;
- 这个答案是Ture, 因为java有自动拆箱装箱的机制,在这里比较的时候,会自动的把Integer对象的value拿出来,其实就是俩个primitive type的int 作比较,相当于2 == 2;
- new Integer(6) == new Integer(6);
- 这个答案是false, 显而易见,俩个对象进行比较,就算数值相同,也只是对象内部数据的值, 并不代表对象相同,==运算符比较的就是对象是否是不是一个
- Integer.valueOf(6) == Integer.valueOf(6);
- 这个答案是ture, 这里涉及到了valueOf的源码:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
+ 注意到,这里有一个low和high的概念,也就是说,如果在这个范围内,那么其实是在一个缓冲中拿到对象,反之就是重新new一个对象来返回。看看这个low和high的值
static final int low = -128;
static final int high;
+ 说到这里就很明白啦,如果value在这个范围内的话,其实通过valueOf获得的对象是从缓冲中拿到的同一个对象,所以这一题是True,可以尝试自己修改6为10000来查看这时候的这题的答案会是啥
- Integer.valueOf(6).intValue() == 6;
- 这个答案是True, 这道题逻辑清晰,把6装箱进入一个Integet,然后调用intValue()函数,
public int intValue() {
return value;
}
+ 通过函数返回对象中存储int值的value
- new Integer(6).equals(new Integer(6));
- 这题的答案是True, 这里其实直接就是常用的对象比较,利用函数equals进行自定义比较,这里的话,Integer对象已经有了equals函数
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
+ 先比较对象类型,然后比较value的值,一目了然。