java中为什么自动装箱拆箱_为什么我们在Java中使用自动装箱和拆箱?

需要一些上下文才能充分了解此背后的主要原因。

基础与课程

Java中的基本变量包含值(整数,双精度浮点二进制数等)。因为these values may have different lengths,包含它们的变量也可能有不同的长度(考虑浮点数与双倍的)。

另一方面,类变量包含对实例的引用。引用通常在许多语言中被实现为指针(或与指针非常相似的东西)。这些东西通常具有相同的大小,而不管它们引用的实例的大小(对象,字符串,整数等)。

原始变量不能以相同的方式相互交换,彼此之间也不能与Object进行交换。最明显的原因(但不是唯一的原因)是他们的大小差异。这使得原始类型在这方面不方便,但我们仍然需要他们在语言(主要是归结为性能的原因)。

泛型和类型擦除

通用类型是具有一个或多个类型参数的类型(确切数字称为通用类型)。例如,通用类型定义List< T>具有类型参数T,其可以是Object(产生具体类型List< Object>),String(List< String>),Integer(List< Integer>)等等。

通用类型比非通用类型复杂得多。当它们被引入Java(在其初始发行版本之后)时,为了避免对JVM进行根本性的更改,并可能破坏与旧二进制文件的兼容性,Java的创建者决定以最小侵入的方式实现泛型类型:所有具体类型列表< T>实际上被编译为(二进制等价物)List< Object> (对于其他类型,绑定可能是Object以外的其他东西,但是您可以得到这一点)。通用的arity和类型参数信息在这个过程中丢失,这就是为什么我们称之为type erasure。

把两者放在一起

现在问题是上述现实的组合:如果List< T>成为List< Object>在所有情况下,T必须始终是可以直接分配给Object的类型。还有别的东西是不允许的。因为,正如我们前面所说的,int,float和double不能与Object互换,所以不能有List< int>,List< float>或列表< double> (除非在JVM中存在明显更复杂的泛型实现)。

但是,Java提供的类型像Integer,Float和Double这样的类,它们将这些基元包装在类实例中,使它们可以有效地替代为Object,从而允许泛型类型间接地与原语一起工作(因为你可以使用List< Integer>,List&Float> ;,列表< Double>等等)。

从int,float等浮点数创建Integer的过程称为boxing.反过来称为取消装箱。因为每次你想使用它们作为Object的box原型是不方便的,有一些情况下,语言自动执行这一操作 – that’s called autoboxing。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值