Java包装类与泛型详解
基本类型与包装类的对应关系
8种基本类型及其包装类对应如下:
- byte → Byte
- short → Short
- int → Integer
- long → Long
- float → Float
- double → Double
- char → Character
- boolean → Boolean
Integer和Character的命名与其他包装类不同,其余包装类均为基本类型首字母大写。
装箱与拆箱操作
手动装箱与拆箱:
Integer ii = Integer.valueOf(10); // 手动装箱
int j = ii.intValue(); // 手动拆箱
自动装箱与拆箱:
Integer ii = 10; // 自动装箱
int j = ii; // 自动拆箱
避免在循环中频繁使用自动装箱,因为会产生额外的对象创建开销。
包装类的缓存机制
Integer缓存范围默认是-128到127:
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // trueInteger c = 128;
Integer d = 128;
System.out.println(c == d); // false
其他包装类如Long、Short也有类似的缓存机制,但范围可能不同。
泛型的核心价值
传统Object数组的问题:
Object[] arr = new Object[3];
arr[0] = "string";
arr[1] = 123; // 编译通过,运行时报错风险
String s = (String) arr[1]; // ClassCastException
泛型改进:
MyArray<String> arr = new MyArray<>();
arr.add("hello");
String s = arr.get(0); // 无需强制转换
泛型类的定义
基本语法:
class MyArray<T> {private T[] array;// ...
}
类型实参必须是类类型,基本类型需使用对应的包装类。类型推导简化写法:
MyArray<String> arr = new MyArray<>();
泛型擦除机制
编译后泛型类型会被擦除,替换为Object或上界类型。通过反射创建泛型数组的正确方式:
public <T> T[] createArray(Class<T> clazz, int size) {return (T[]) Array.newInstance(clazz, size);
}
泛型上界
约束类型参数的范围:
class NumberContainer<T extends Number> {// T只能是Number或其子类
}
复杂上界:
class SortedList<T extends Comparable<T>> {// T必须实现Comparable接口
}
泛型方法
独立于类的泛型方法:
public static <T> void swap(T[] arr, int i, int j) {T temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}
静态泛型方法必须在static后声明类型参数。使用方法:
swap(arr, 0, 1); // 类型推导
Util.<String>swap(arr, 0, 1); // 显式指定
实践建议
- 多练习编写泛型类和泛型方法
- 分析Java集合框架中的泛型应用
- 通过解决编译错误深入理解泛型约束
- 结合反射理解擦除机制的实际影响