Java 程序设计基础(第6章第3节)|数据类型包装器类
一、整体概述
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. 字符串与数值双向转换是接口传参、数据解析的高频操作,必须牢记异常风险。
更多推荐


所有评论(0)