1、为什么要使用自动装箱和拆箱?
因为List、Map类操作的对象是Object, 不是基本数据类型,当遇到基本数据类型的时候,需要将基本数据类型封装成对应的类。Java从开始就为基本数据类型提供了封装类。
常见的封装类有:
基本数据类型 | 封装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
float | Float |
double | Double |
long | Long |
boolean | Boolean |
char | Character |
-- | String |
二、什么是主动装箱和拆箱?
Java 为每种基本数据类型和其封装类之间的转换功能。
自动装箱:从基本数据类型到封装类(autoboxing)
自动拆箱:从封装类到基本数据类型(autounboxing)
package day20;
public class AutoBoxing {
public static void main(String[] args) {
int a = 999;
Integer m = a;
int c = 999;
System.out.println(m);
System.out.println(getType(m));
System.out.println(c == m);
}
// 打印类型
static String getType(Object a) {
return a.getClass().toString();
}
}
输出结果:

三、 自动拆箱、装箱在List、Map中的使用
Map<Integer, String> int2Str = new HashMap<>();
int2Str.put(1, "壹");
int2Str.put(2, "贰");
int2Str.put(3, "叁");
System.out.println(int2Str.get(1));
for(int key: int2Str.keySet()) {
System.out.println(key);
}
四、 注意事项
注意可能会出现NPE的异常: 因为基本数据类型是没有
null
的,对应的封装类是可以为null
,当封装类自动拆箱成基本数据类型的时候,需要判断是否为null,然后再进行转换。
代码示例:
package day20;
import java.util.HashMap;
import java.util.Map;
public class AutoBoxing {
public static void main(String[] args) {
Map<Integer, String> int2Str = new HashMap<>();
int2Str.put(1, "壹");
int2Str.put(2, "贰");
int2Str.put(3, "叁");
int2Str.put(null, "空");
for(int key: int2Str.keySet()) {
System.out.println(key);
}
}
// 打印类型
static String getType(Object a) {
return a.getClass().toString();
}
}
运行结果:

五、使用Number类进行数据类型转换
所有和数字相关的封装类都继承自Number,可以使用Number的.xValue方法,获取对应的值。
代码示例如下:
Number x = 9;
x = new Integer(99);
System.out.println(x.longValue());
System.out.println(x.intValue());
System.out.println(x.doubleValue());
六、判断是否两个值是否相等?
- 基本数据类型使用
==
- 符合数据类型(类的实例)使用
equals
此时需要注意的是字符串对象是有缓存池的,当声明一个字符串A=”xxxx“的时候, 再声明一个字符串B=”xxxx“的时候,默认AB指向的是同一个引用。
如果要新生成需要用显示的New一个对象出来。
网友评论