泛型与集合结合是Java标准实践,必须声明类型参数(如List<String>),以获得编译期类型安全、免强制转换和IDE精准提示;需据场景选实现类,并合理使用通配符,同时规避类型擦除限制。

泛型与集合类的结合不是“高级技巧”,而是 Java 集合使用的标准姿势。核心就一条:**所有集合类都应带类型参数声明,不写泛型就是放弃编译期类型保护**。
声明时明确类型参数
用 List<String> 代替 List,用 Map<String, Integer> 代替 Map。这不是可选项,是必须项。
- 编译器能立刻捕获类型错误:比如
list.add(42)在List<String>中直接报错,而不是等运行时抛ClassCastException - 取值无需强制转换:
String s = list.get(0)可直接赋值,不再需要(String) list.get(0) - IDE 能提供精准的代码提示和自动补全,大幅提升开发效率
选择匹配场景的泛型集合实现
泛型本身不决定性能,但你要选对底层实现——类型安全的前提是逻辑正确,逻辑正确的前提是选对数据结构。
- 需要频繁随机访问(如按索引查学生信息)→ 用
ArrayList<Student>:数组结构,get(i)是 O(1) - 需要高频头尾增删(如消息队列、栈操作)→ 用
LinkedList<String>:链表结构,addFirst()和removeLast()是 O(1) - 需要去重且有序(如成绩排名)→ 用
TreeSet<Integer>或TreeMap<String, Double>:红黑树保证自然排序
合理使用通配符提升灵活性
当方法要处理多种具体类型的集合时,硬写死 List<Integer> 或 List<Double> 就会重复造轮子。这时用通配符解耦。
立即学习“Java免费学习笔记(深入)”;
- 只读场景(如求和、统计)→ 上界通配符:
double sum(List<? extends Number> nums),接受List<Integer>、List<Double>等 - 只写场景(如批量添加日志)→ 下界通配符:
void logAll(List<? super String> logs),可接收List<Object>或List<CharSequence> - 纯遍历或清空 → 无界通配符:
void clearAll(List<?> list),安全且通用
避开泛型擦除带来的坑
Java 泛型在编译后会被擦除为原始类型(如 List<String> → List),这带来几个典型限制,提前知道就能绕开:
- 不能创建泛型数组:
new ArrayList<String>[10]编译失败,改用new ArrayList[10](不推荐)或容器嵌套(如List<List<String>>) - 不能用
instanceof检查泛型类型:if (list instanceof List<String>)语法错误,只能判断原始类型:list instanceof List - 静态字段/方法不感知类型参数:一个
Box<String>和Box<Integer>共享同一份静态变量,设计时需注意


















