一、包装类型:基本类型的“对象外衣”
Java为8种基本类型提供了对应的包装类(Wrapper Classes),使其具备对象特性:
· byte -> Byte
· short -> Short
· int -> Integer
· long -> Long
· float -> Float
· double -> Double
· char -> Character
· boolean -> Boolean
核心价值:
- 对象化: 可存入Collection等仅处理对象的容器。
- 提供工具方法: 如Integer.parseInt()、Character.isLetter()等静态方法。
- 支持null: 表示缺失值(但需警惕NullPointerException)。
二、自动装箱与拆箱:甜蜜的陷阱
Java 5+ 引入自动装箱(Autoboxing) 和自动拆箱(Unboxing),简化代码:
Integer boxed = 42; // 自动装箱:int -> Integer
int primitive = boxed; // 自动拆箱:Integer -> int
等价于:
Integer boxed = Integer.valueOf(42); // 注意:使用valueOf而非new
int primitive = boxed.intValue();
三、缓存机制:性能优化与“==”的玄机
关键特性: 部分包装类(Integer, Byte, Short, Long, Character, Boolean)对常用范围值进行缓存。
· Integer缓存:默认-128 ~ 127
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true: 同一缓存对象
Integer c = 128;
Integer d = 128;
System.out.println(c == d); // false: 超出缓存范围,new新对象!
· Boolean缓存:TRUE, FALSE
Boolean t1 = true;
Boolean t2 = true;
System.out.println(t1 == t2); // true: 总是同一对象
== vs equals():
· ==: 比较对象内存地址。受缓存影响,值相同不一定true!
· equals(): 比较包装的基本值是否相等。始终是值比较的安全选择。
Integer x = 200;
Integer y = 200;
System.out.println(x == y); // false (地址不同)
System.out.println(x.equals(y)); // true (值相同)
四、null的风险:空指针的伏笔
包装类型可为null,拆箱时触发NullPointerException:
Integer possibleNull = null;
// int value = possibleNull; // 运行时抛出NullPointerException!
// 安全操作:先判空
if (possibleNull != null) {
int safeValue = possibleNull;
}
五、性能考量:慎重大规模使用
自动装箱/拆箱及对象创建有开销:
// 性能陷阱:循环内反复装箱
Long sum = 0L; // 被当作Long对象
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i; // 反复拆箱(sum) + 加法 + 装箱(结果)
}
// 优化:使用基本类型long
long sumFast = 0L;
六、最佳实践总结
- 值比较: 始终优先使用equals()而非==。
- 警惕缓存: 明确==在缓存范围内的特殊行为,避免误判。
- null处理: 对可能为null的包装类型,拆箱前务必检查。
- 性能敏感处: 循环或高频计算中,优先使用基本类型。
- 集合存储: 需对象特性时(如放入ArrayList)自然使用包装类型。
理解包装类型的对象本质、缓存机制及自动转换原理,是规避陷阱、编写健壮高效Java代码的关键。善用其对象能力,警惕其比较与空值风险,方能在开发中游刃有余。

被折叠的 条评论
为什么被折叠?



