java 手动装箱与拆箱_Java装箱与拆箱

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对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值