一、整体概述

Java 8种基本数据类型不是Object子类,不能存入List、Map等集合,也无法使用泛型,为此JDK为每种基本类型都提供了对应的包装类,全部位于java.lang包,默认无需导入。
基本类型与包装类一一对应:
byte→Byte、short→Short、int→Integer、long→Long、float→Float、double→Double、char→Character、boolean→Boolean。
包装类本质是把基本数值封装成对象,补齐了基本类型没有成员方法、不能参与面向对象编程的短板。

二、整型包装器类详解

以最常用的Integer为代表,所有数值型包装类都内置静态常量:MAX_VALUE最大值、MIN_VALUE最小值,可直接查看类型取值边界。
同时内置进制转换静态方法:十进制转二进制toBinaryString()、转八进制toOctalString()、转十六进制toHexString(),无需手动算法计算进制。

1)手动装箱、拆箱

装箱:基本类型 → 包装对象
int num = 10;
Integer i = Integer.valueOf(num);
拆箱:包装对象 → 基本类型
int n = i.intValue();
2)自动装箱&自动拆箱(JDK1.5+)

编译器编译阶段自动补充valueOf()、xxxValue()代码,编码时不用手动转换:
Integer a = 20; // 自动装箱 Integer.valueOf(20)
int b = a;      // 自动拆箱 a.intValue()
日常开发99%场景都直接使用自动转换,极大简化代码。

3)Integer缓存池(面试高频)

Integer.valueOf()自带缓存数组IntegerCache,默认缓存区间:-128 ~ 127。
该区间内的整数不会新建对象,直接复用缓存中的已有实例,用==比较地址相等;超出区间会new新Integer对象,地址不同。
示例:
Integer x = 10;
Integer y = 10;
System.out.println(x==y); // true,复用缓存

Integer m = 200;
Integer n = 200;
System.out.println(m==n); // false,新建两个对象
开发规范:包装类数值比较永远用equals(),不要用==。
三、字符串和数字的相互转换(实用案例)

前后端交互、配置文件读取时,传入的数字都是字符串格式,必须做双向转换。

1)字符串 → 基本数值类型

调用包装类静态parseXxx(String s),传入纯数字字符串即可转换;字符串含非数字字符会抛出NumberFormatException,必须异常捕获。
String str = "123";
int a = Integer.parseInt(str);
double b = Double.parseDouble(str);
2)基本数值 → 字符串

三种常用写法:
int num = 666;
String s1 = num + "";                // 字符串拼接(最简单)
String s2 = Integer.toString(num);    // 包装类toString
String s3 = String.valueOf(num);      // String静态方法
四、浮点型、字符、布尔包装类补充

1. Float/Double:没有固定缓存池,浮点数值精度不固定,不适合用==比对;

2. Character:封装单个字符,提供字符判断方法(是否数字、字母、大小写转换);

3. Boolean:仅缓存TRUE/FALSE两个静态常量,只有true/false字符串能正常解析。

五、小节总结

1. 包装类解决了基本类型无法面向对象、无法存入集合、不支持泛型的痛点;

2. 自动装箱拆箱是语法糖,底层依旧调用valueOf和xxxValue;

3. Integer缓存池是经典面试考点,包装类比较强制用equals;

4. 字符串与数值双向转换是接口传参、数据解析的高频操作,必须牢记异常风险。

更多推荐