
1. Java包装类基础与核心机制Java的8种基本数据类型都有对应的包装类它们将基本类型的数据封装成对象使得基本类型也能享受面向对象的特性。这8种包装类分别是Byte对应byteShort对应shortInteger对应intLong对应longFloat对应floatDouble对应doubleCharacter对应charBoolean对应boolean这些包装类都位于java.lang包下其中6个数值型包装类的父类是Number类。包装类的主要作用有三个让基本类型具备对象的特性提供类型转换的方法包含各种实用的常量如MAX_VALUE在实际开发中Integer是最常用的包装类我们以它为例深入分析。Integer有两个构造方法Integer i1 new Integer(100); // 通过int值创建 Integer i2 new Integer(100); // 通过字符串创建不过要注意从Java 9开始这些构造方法已经被标记为Deprecated推荐使用静态工厂方法valueOf()Integer i3 Integer.valueOf(100); Integer i4 Integer.valueOf(100);2. Integer缓存机制深度解析Java为了提高性能为Integer类设计了一个静态内部类IntegerCache它缓存了-128到127之间的Integer对象。当通过valueOf()方法创建Integer对象时如果值在缓存范围内就会直接返回缓存的对象。public static Integer valueOf(int i) { if (i IntegerCache.low i IntegerCache.high) return IntegerCache.cache[i (-IntegerCache.low)]; return new Integer(i); }这个机制会导致一些有趣的现象Integer a 127; Integer b 127; System.out.println(a b); // true因为使用了缓存对象 Integer c 128; Integer d 128; System.out.println(c d); // false超出缓存范围新建对象缓存的上界可以通过JVM参数调整-XX:AutoBoxCacheMaxsize3. 自动装箱与拆箱原理剖析自动装箱和拆箱是Java 5引入的语法糖让基本类型和包装类之间的转换更加简洁。自动装箱基本类型自动转为包装类Integer i 100; // 实际编译为Integer i Integer.valueOf(100);自动拆箱包装类自动转为基本类型int num i; // 实际编译为int num i.intValue();在运算时也会自动拆箱Integer x 10; Integer y 20; int sum x y; // 自动拆箱后相加但要注意自动拆箱可能引发NullPointerExceptionInteger z null; int num z; // 运行时抛出NullPointerException4. String与int/Integer的高效互转在实际开发中String与基本类型的转换非常常见。以下是几种高效转换方式String转int// 方式1Integer.parseInt() int num1 Integer.parseInt(123); // 方式2Integer.valueOf() 自动拆箱 int num2 Integer.valueOf(123); // 方式3先转为Integer再拆箱 Integer integer Integer.valueOf(123); int num3 integer.intValue();int转String// 方式1String.valueOf() String str1 String.valueOf(123); // 方式2Integer.toString() String str2 Integer.toString(123); // 方式3字符串拼接性能较差 String str3 123 ;Integer和String互转// String - Integer Integer i1 Integer.valueOf(123); // Integer - String String s1 i1.toString();5. 性能优化与避坑指南避免不必要的装箱在循环中使用包装类会导致大量对象创建// 不好的写法 Long sum 0L; for(long i0; i1000000; i) { sum i; // 每次循环都会自动装箱 } // 优化写法 long sum 0L;比较时注意缓存范围Integer a 100; Integer b 100; a b // true Integer c 200; Integer d 200; c d // false应该使用equals()处理可能为null的情况Integer value getFromDB(); // 可能返回null int num value; // 可能抛出NPE // 安全写法 int safeNum value ! null ? value : 0;优先使用valueOf而不是构造方法// 不推荐 Integer i new Integer(100); // 推荐 Integer i Integer.valueOf(100);6. 实战应用字符串排序案例下面是一个综合应用包装类和类型转换的实际案例 - 对包含数字的字符串进行排序public class NumberStringSort { public static void main(String[] args) { String input 93 28 49 35 52; // 1. 分割字符串 String[] numStrs input.split( ); // 2. 转换为int数组 int[] nums new int[numStrs.length]; for(int i0; inumStrs.length; i) { nums[i] Integer.parseInt(numStrs[i]); } // 3. 排序 Arrays.sort(nums); // 4. 拼接结果 StringBuilder sb new StringBuilder(); for(int i0; inums.length; i) { if(i 0) sb.append( ); sb.append(nums[i]); } System.out.println(sb.toString()); // 输出28 35 49 52 93 } }这个案例展示了如何将字符串转换为数值进行排序后再转换回字符串是包装类和类型转换的典型应用场景。