Java 原始类型的包装类
本文介绍 Java 包装类,以及它们的用法,原始类型和对象之间的转换,并通过示例介绍自动装箱和拆包。
本文介绍 Java 包装类,以及它们的用法,原始类型和对象之间的转换,并通过示例介绍自动装箱和拆包。
1. Java 包装类
Java 提供了几个包装类,这些包装类是对原始类型的封装。在 Java 中,我们有8 种原始数据类型。
包装类将数据类型包装(封装)并赋予其对象外观。在任何需要数据类型作为对象的地方,都可以使用此对象。包装类也提供了用于解包对象并返回原始类型的方法。
所有的包装类都位于 java.lang_包。
每个基本类型都有一个对应的包装类。
基本类型 | 包装类 |
---|---|
double |
Double |
float |
Float |
long |
Long |
int |
Integer |
short |
Short |
byte |
Byte |
char |
Character |
boolean |
Boolean |
2. 何时使用包装类
在下面的场景中可以使用 Java 包装类:
- 当两个方法要引用基本类型的相同实例时,请使用包装类作为方法参数传递。
- Java 中的泛型仅适用于对象,不支持原始类型。
- Java 中的集合仅处理对象。要将原始类型存储在这些类之一中,您需要将原始类型包装在一个类中。
- 当您要从数据类型引用
null
时,需要使用包装类。原始不能为null
。
3. 转换
3.1 原始类型转为包装类
有两种方法可以将原始类型转换为相应包装类的对象
- 使用构造方法
- 使用静态工厂方法,例如
valueOf()
(Character 除外)
// 1. 使用构造方法
Integer object = new Integer(10);
// 2. 使用静态方法
Integer anotherObject = Integer.valueOf(10);
在上面的示例中,valueOf() 方法返回一个表示指定 int
值的实例。
同样,我们可以将其他基本类型转换,例如 boolean
到 Boolean
, char
到 Character
,short
到 Short
等。
3.2 包装类转为原始类型
从包装器转换为原始类型很简单。我们可以使用相应的方法来获取基本类型。例如 intValue()
,doubleValue()
,shortValue()
等。
Integer object = new Integer(10);
int val = object.intValue(); // wrapper to primitive
4. 自动装箱和拆包
从 JDK 5 开始,Java 添加了两个重要功能:自动装箱_和_自动拆包。
4.1 自动装箱
自动装箱是将原始类型自动转换为对应的对象包装类。例如,转换 int
为 Integer
,转换 char
为 Character
等等。
我们可以简单地将原始类型传递或赋值给接受包装类对象的参数或引用。例如
Character ch = 'a'; // char to Character
List<Integer> integerList = new ArrayList<>();
for (int i = 1; i < 10; i ++)
{
integerList.add(i); // int to Integer 自动装箱
}
integerList
是 Integer 对象的列表,而不是基本类型 int 值的列表。编译器会自动从中创建一个 Integer 对象 i
,并将该对象添加到 integerList
中。因此,前面的代码在运行时变成了下面的代码:
List<Integer> integerList = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
{
integerList.add(Integer.valueOf(i));
}
4.2 拆包
从包装类到其对应的原始类型的转换发生拆包。这意味着我们可以将包装对象传递或赋值给接受原始类型的参数或引用。例如
public static int sumOfEven(List<Integer> integerList)
{
int sum = 0;
for (Integer i: integerList) {
if (i % 2 == 0)
sum += i; //Integer to int
}
return sum;
}
在上面的示例中,求余(%
)和加赋值(+=
)运算符不适用于 Integer 对象。编译器在运行时通过调用 intValue()
方法自动将 Integer 转换为 int 。
自动装箱和拆包使开发人员可以编写更干净的代码,从而更易于阅读。