Java装箱与拆箱
装箱拆箱,可以说是对于工程上没什么大不了的东西,但是在学术方面非常卓越的特性。现在我想讨论一下Java的装箱与拆箱
我们都知道int i = 1;是可以的,double b = 1; 是可以的 ,
Integer i = 1; 也是可以的。但是当我们写出Double b = 1;
的时候,却会发现Java编译器会报错 不兼容的类型 。 那么这是为什么呢?
public class Test
{
public static void main()
{
Integer a = 1;
}
}
将生成的.class文件反编译之后得
public class Test
{
Test(){
}
public static void main(String[] args)
{
Integer a = Integer.valueOf(1);
}
}
valueOf这个函数在上文中会返回一个Integer对象。
也就是在Java装箱会隐式调用函数valueOf()装箱也会调用相应的intValue()
但是这个过程在C#中是一个内部的过程boxing而不是一个函数
同样在Java和C#中进行对比
public class Test
{
public static void main(String[] args)
{
Object o1 = 1;
Object o2 = 1;
System.out.println(o1 == o2);
}
}
结果输出是
true
顺便一说Java的valueOf中有缓冲区设定,考虑下面代码
public class
{
public static void main(String[] args)
{
Integer a1 = 100;
Integer a2 = 100;
Integer b1 = 200;
Integer b2 = 200;
System.out.println(a1 == a2);
System.out.println(b1 == b2);
}
}
输出是
true
false
原因在与valueOf()函数, 为
public static Integer valueOf(int i)
{
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
感谢@16级Java助教的帮助
这段函数的意思是当字面值在low(-128)和high(127)之间时,会指向缓冲区数组中的一个元素,否则指向一个新的Integer对象