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

自动装箱/拆箱的好处

  1. 自动装箱/拆箱让我们可以互换使用基本类型和包装类对象。
  2. 我们不需要执行显式类型转换
  3. 它有助于防止错误,但有时可能会导致意想不到的结果。因此必须小心使用。
  4. 自动拆箱还允许您在表达式中混合不同类型的数字对象。当值未装箱时,可以应用标准类型转换。

示例:

 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