Java 包装类之应用技巧

Java 包装类的核心作用

Java包装类(如IntegerDoubleBoolean等)将基本数据类型转换为对象,主要解决以下场景:

  1. 集合框架(如List)必须使用对象类型
  2. 需要区分未赋值状态(null0的差异)
  3. 提供类型转换、进制转换等工具方法
// 基本类型与包装类转换
int primitive = 42;
Integer wrapped = Integer.valueOf(primitive); // 装箱
int unpacked = wrapped.intValue();           // 拆箱

自动装箱与性能优化

JDK5引入的自动装箱机制存在隐藏性能开销,高频操作时应特别注意:

// 低效做法(隐含多次装箱)
Integer sum = 0;
for(int i=0; i<10000; i++) {
    sum += i; // 等价于 sum = Integer.valueOf(sum.intValue() + i)
}

// 优化方案
int sumPrimitive = 0;
for(int i=0; i<10000; i++) {
    sumPrimitive += i;
}
Integer sum = sumPrimitive;

对象缓存机制

包装类在特定范围(如-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(新建对象)

建议始终使用equals()进行比较:

System.out.println(c.equals(d)); // true

类型转换最佳实践

包装类提供丰富的类型转换方法,需注意异常处理:

// 字符串转数值
String numStr = "3.14";
try {
    Double d = Double.parseDouble(numStr);
    System.out.println(d * 2);
} catch (NumberFormatException e) {
    System.err.println("非法数字格式");
}

// 进制转换
System.out.println(Integer.toString(255, 16));  // 输出"ff"
System.out.println(Integer.parseInt("FF", 16)); // 输出255

NPE防护技巧

包装类可能引发NullPointerException,推荐防御性编程:

Integer nullableValue = getFromExternalSource();
int safeValue = Optional.ofNullable(nullableValue).orElse(0);

// 或者使用三元运算符
int result = (nullableValue != null) ? nullableValue : defaultValue;

特殊场景处理

处理系统边界值时需特别注意:

// 最大值溢出检测
Integer max = Integer.MAX_VALUE;
if(max + 1 < max) {  // 错误方式!会整数溢出
    System.out.println("溢出发生");
}

// 正确方式
if(max != Integer.MAX_VALUE) {
    Integer newVal = Math.addExact(max, 1);
}

集合框架中的运用

包装类在集合操作中的典型应用:

List numbers = Arrays.asList(1, 2, null, 4);

// 过滤null值并求和
int sum = numbers.stream()
                .filter(Objects::nonNull)
                .mapToInt(Integer::intValue)
                .sum();

// 转换为原始类型数组
int[] primitiveArray = numbers.stream()
                             .filter(Objects::nonNull)
                             .mapToInt(i -> i)
                             .toArray();

新版特性增强

JDK9后包装类提供内存优化:

// 新版valueOf()实现更高效
Integer optimized = Integer.valueOf(100);  // 可能使用缓存
Integer newInstance = new Integer(100);    // 始终创建新对象(已废弃)

你可能感兴趣的:(java,开发语言)