在Integer缓存池-CSDN博客中我们讲到了自动装箱也会隐式调用Integer.valueOf()方法,那装箱到底是什么呢?🐽
装箱(Boxing) 和 拆箱(Unboxing) 是 Java 中的一种语法特性,主要用于在 基本数据类型 和 包装类对象 之间进行转换。它们的引入主要是为了增强 Java 的灵活性和易用性,尤其是在泛型、集合框架等场景中。
装箱(Boxing)
装箱是指将基本数据类型转换为对应的包装类对象。例如,将int
转换为Integer
,double
转换为Double
等。示例如下:
int a=123;
Integer box1=Integer.valueOf(a);//手动装箱
Integer box2=a;//自动装箱
拆箱(Unboxing)
拆箱是指将包装类对象转换回基本数据类型。例如,将Integer
转换为int
,Double
转换为double
等。示例如下:
Integer a=10;
int unbox1=a.intValue();//手动拆箱
int unbox2=a;//自动拆箱
自动装箱和拆箱
Java 5引入了自动装箱和拆箱功能,编译器会自动完成这些转换,简化代码。
// 自动装箱
Integer autoBoxedInt = 10; // 编译器自动将int转换为Integer
// 自动拆箱
int autoUnboxedInt = autoBoxedInt; // 编译器自动将Integer转换为int
注意事项
性能开销:
-
装箱和拆箱会创建临时对象,可能带来额外的内存分配和垃圾回收开销。
-
在性能敏感的代码中,应尽量避免频繁的装箱和拆箱操作。
-
举个栗子~
long startTime = System.nanoTime(); for (int i = 0; i < 1000000; i++) { Integer boxed = i; // 自动装箱 int unboxed = boxed; // 自动拆箱 } long endTime = System.nanoTime(); System.out.println("Time taken: " + (endTime - startTime) + " ns");
空指针异常:
-
拆箱时,如果包装类对象为
null
,会抛出NullPointerException
。Integer boxedInt = null; int unboxedInt = boxedInt; // 抛出 NullPointerException
缓存机制:
-
包装类(如
Integer
、Long
)对一定范围内的值进行了缓存,超出范围时会创建新对象。Integer a=127; Integer b=127; System.out.println(a==b); //true System.out.println(a.equals(b)); //true Integer a1=128; Integer b1=128; System.out.println(a1==b1); //false System.out.println(a1.equals(b1)); //true
-
包装类对象需要使用"
equals()"
方法进行比较,而非"=="
,因为==
比较的是引用而非值。 -
我利用"
=="
比较是想让大家进一步了解Integer缓存池的特点,常量池的范围是-128~127,如果超出了常量池的范围,那在自动装箱的时候就会创建新对象。所以a1与b1超出了Integer缓存池的范围,就会创建新对象存放在不同的内存地址中。
装箱和拆箱的优点:
-
支持泛型和集合框架。
-
简化代码,减少手动转换的繁琐。
-
提高代码可读性和可维护性。
-
增强代码的兼容性和灵活性。
-
支持面向对象编程。
本猪是萌新,有不完善或者不正确的地方,欢迎大家留言。🐽
肥嘟嘟左卫门就讲到这里啦,麻烦大家一键三连!!!🐽