java unboxing_[Java]Autoboxing & Unboxing

原文链接:https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

一、Autoboxing

Autoboxing是java编译器提供的一种从原始类型到对应包装类型(wrapper classes)的自动转换功能。如int转Integer,double转Double等。如果从包装类型转为原始类型,则称为Unboxing。

一个最简单的autoboxing的例子:

Character ch = 'a';

还有一些autoboxing是泛型编程(Generics/Updated)实现的,如:

List li = new ArrayList<>();

for (int i = 1; i < 50; i += 2)

li.add(i);

由于li是Integer对象的列表,而不是int的列表,此时编译器通过每个i创建一个Integer的对象并加入li中,所以实际的过程可以表示如下:

List li = new ArrayList<>();

for (int i = 1; i < 50; i += 2)

li.add(Integer.valueOf(i));    其中 int 型的 i 转化为 Integer 对象的过程就称为autoboxing。

Java编译器在如下情况下会采用autoboxing:

1. 在方法传参时,一个原始类型的实际参数被传给了一个需要相应包装类对象的形式参数;

2. 一个原始类型的值被赋给了其相应的包装类。

二、Unboxing

考虑如下情况:

public static int sumEven(List li) {

int sum = 0;

for (Integer i: li)

if (i % 2 == 0)

sum += i;

return sum;

}

由于Integer对象不具有取模%和+=操作符,此时编译器在运行时会将Integer转换为int,该过程即unboxing。所以实际过程如下:

public static int sumEven(List li) {

int sum = 0;

for (Integer i : li)

if (i.intValue() % 2 == 0)

sum += i.intValue();

return sum;

}

Java编译器在如下情况下会采用unboxing:

1. 在方法传参时,一个包装类对象的实际参数被传给了一个需要相应原始类型的形式参数;

2. 一个包装类对象的值被赋给了其相应的原始类型。

import java.util.ArrayList;

import java.util.List;

public class Unboxing {

public static void main(String[] args) {

Integer i = new Integer(-8);

// 1. Unboxing through method invocation

int absVal = absoluteValue(i);

System.out.println("absolute value of " + i + " = " + absVal);

List ld = new ArrayList<>();

ld.add(3.1416);    // Π is autoboxed through method invocation.

// 2. Unboxing through assignment

double pi = ld.get(0);

System.out.println("pi = " + pi);

}

public static int absoluteValue(int i) {

return (i < 0) ? -i : i;

}

}

总结:

Autoboxing和Unboxing使得开发者的代码更加简洁易读,下表为autoboxing和unboxing中常用的对应转换。

Primitive typeWrapper classbooleanBooleanbyteBytecharCharacterfloatFloatintIntegerlongLongshortShortdoubleDouble

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值