Java 中的自动装箱和拆箱
吴奇珍:t0]https://www . studytonight . com/Java/autoboxing-unboxing-Java . PHP
在 Java 1.5 中,Java 增加了自动装箱和拆箱的概念,处理原始类型到对象的转换,反之亦然。
术语自动装箱是指图元类型的自动转换到其对应的对象类型。例如,将整型转换为整型对象,或将Character
类型转换为字符对象。这种转换是由 Java 编译器在程序执行过程中隐式完成的。
在同一上下文中,当一个对象转换到其对应的基本类型时,它被称为拆箱。例如,Integer
类型到整型或字节到Byte
类型的转换等。Java 在程序执行过程中自动执行这种转换。
自动装箱示例
在本例中,我们将 int 类型值赋给 Integer 对象,注意编译器不会报告任何错误,因为它在这里执行自动装箱。
class Demo
{
public static void main(String[] args)
{
Integer i = 100; // Auto-boxing of int i.e converting primitive data type int to a Wrapper class Integer
System.out.println(i);
Character ch = 'a';
System.out.println(ch);
Byte b = 12;
System.out.println(b);
}
}
100 a 12
解释:
每当我们在表达式中使用 包装类的对象时,自动装箱都是由 JVM 完成的。
当我们在表达式或条件等中使用 包装类对象时,这种情况总是会发生。
示例:集合中的自动装箱
import java.util.ArrayList;
class Demo
{
public static void main(String[] args)
{
ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(100); // autoboxing int to Integer
arrayList.add(200);
arrayList.add(300);
for(Integer i : arrayList) {
System.out.println(i);
}
}
}
100 200 300
以同样的方式,我们可以执行拆箱。让我们看一个例子。
示例:拆箱
在这个例子中,我们使用 arraylist 来存储 int 类型的值。由于ArrayList
只存储对象,因此它会自动将整型转换为整型并存储元素。如果我们获取它的元素,它会返回对象类型,如果我们将它存储为原始的 int 类型,那么它会自动将 Integer 转换为 int 类型。见下面的例子。
import java.util.ArrayList;
class Demo
{
public static void main(String[] args)
{
ArrayList <integer>arrayList = new ArrayList<integer>();
arrayList.add(100); // autoboxing int to Integer
arrayList.add(200);
arrayList.add(300);
for(Integer i : arrayList) {
System.out.println(i);
}
// unboxing Integer to int type
int first = arrayList.get(0);
System.out.println("int value "+first);
}
}</integer></integer>
100 200 300 整数值 100
自动装箱/拆箱的好处
- 自动装箱/拆箱让我们可以互换使用基本类型和包装类对象。
- 我们不需要执行显式类型转换。
- 它有助于防止错误,但有时可能会导致意想不到的结果。因此必须小心使用。
- 自动拆箱还允许您在表达式中混合不同类型的数字对象。当值未装箱时,可以应用标准类型转换。
示例:
class Demo {
public static void main(String args[]) {
Integer i = 35;
Double d = 33.3;
d = d + i;
System.out.println("Value of d is " + d);
}
}
d 的值是 68.3
注:当陈述d = d+I;被执行,I 被自动拆箱为 int,d 被自动拆箱为 double,然后执行加法,最后 d 的自动装箱为 Double 类型 包装类。
类型包装
Java 使用原始数据类型,如 int、double、float 等。为了性能而保存基本数据类型。尽管基本数据类型提供了性能优势,但有时您需要基本数据类型的对象表示。例如,Java 中的许多数据结构对对象进行操作。因此,您不能在这些数据结构中使用原始数据类型。为了处理这种类型的情况,Java 提供了类型包装器,它提供了在对象中封装一个基本类型的类。
Java 提供了对应于每个原始类型的包装类来处理下面列出的对象。
| 原始的 | 包装类 | | (同 Internationalorganizations)国际组织 | 整数 | | 字节 | 字节 | | 短的 | 短的 | | 漂浮物 | 浮动 | | 两倍 | 两倍 | | 茶 | 性格;角色;字母 | | 长的 | 长的 | | 布尔 | 布尔代数学体系的 |
上面提到的类属于数值类型包装。这些类封装了字节、短整型、整型、长整型、浮点型、双原始类型。
示例:方法中的自动装箱和拆箱
我们可以看到自动装箱和拆箱是如何在一个方法中发生的。请注意,在方法调用期间,我们传递了 int 类型的基元值,但是方法只接受 Integer 对象,因此在这里 JVM 隐式地执行自动装箱。请注意,这个方法返回一个 int 类型原始类型,这是从 Integer 到 int 类型的另一种转换(拆箱)。
class Demo {
// autoboxing in parameters
static int add(Integer a, Integer b) {
// unboxing in return
return a+b;
}
public static void main(String args[]) {
int sum = add(10,20);
System.out.println("sum = "+sum);
}
}
总和= 30