1. 集合框架全景解析
Java集合框架是每个开发者必须掌握的核心技能之一。记得我刚入行时,面对各种集合类常常一头雾水,直到真正理解了它们的底层实现原理和使用场景,才算是真正入门。今天我们就来深入探讨集合遍历、Set和Map接口这些基础但至关重要的知识点。
集合框架主要分为两大分支:Collection接口和Map接口。Collection下又细分为List(有序可重复)和Set(无序唯一)两大体系。而Map则是完全独立的键值对存储结构。理解这个基本分类,是掌握集合框架的第一步。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 集合遍历的多种姿势
2.1 传统迭代器遍历
迭代器(Iterator)是最基础的集合遍历方式,适用于所有Collection实现类。它的核心在于hasNext()和next()方法的配合使用:
java复制List<String> fruits = Arrays.asList("Apple", "Banana", "Orange");
Iterator<String> it = fruits.iterator();
while(it.hasNext()) {
String fruit = it.next();
System.out.println(fruit);
}
注意:迭代器遍历过程中不能直接修改原集合,否则会抛出ConcurrentModificationException。必须通过迭代器的remove()方法进行删除操作。
2.2 增强for循环
JDK5引入的增强for循环(foreach)本质上也是使用迭代器,但语法更加简洁:
java复制for(String fruit : fruits) {
System.out.println(fruit);
}
这种写法在大多数情况下已经足够,但在需要删除元素或并行遍历时,还是需要回退到显式迭代器方式。
2.3 Java8的forEach方法
Java8为Iterable接口添加了forEach默认方法,配合Lambda表达式可以写出更简洁的代码:
java复制fruits.forEach(fruit -> System.out.println(fruit));
// 或者使用方法引用
fruits.forEach(System.out::println);
3. Set接口深度剖析
3.1 HashSet的实现原理
HashSet是最常用的Set实现,它的底层实际上是一个HashMap实例。当我们调用add()方法时:
java复制public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
这里的PRESENT是一个静态的Object对象,作为HashMap的值占位符。HashSet的核心特性:
- 基于hashCode()和equals()判断元素唯一性
- 插入顺序不保证,遍历顺序可能变化
- 允许null元素
- 线程不安全
3.2 TreeSet的排序机制
TreeSet基于TreeMap实现,元素按照自然顺序或者Comparator指定的顺序排序:
java复制Set<Integer> numbers = new TreeSet<>();
numbers.add(3);
numbers.add(1);
numbers.add(2);
System.
