Java集合基础使用全攻略:从入门到实战案例解析
目录导读
集合框架概述与核心接口
Java集合框架(Collection Framework)是日常开发中最常用的数据结构库,它提供了List、Set、Map三大核心接口,以及ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等实现类。

为什么需要集合? 数组长度固定、操作繁琐,而集合支持动态扩容、类型安全、丰富操作API。
核心接口关系:
- Collection(单列集合):List(有序可重复)、Set(无序不可重复)
- Map(双列集合):存储键值对,键唯一
// 基础引入 import java.util.*;
小问答:集合和数组的最大区别是什么?
答:数组长度固定,集合长度可变;数组可以存储基本类型和对象,集合只能存储对象(自动装箱机制可弥补)。
List接口基础使用案例
List是最常用的有序集合,允许重复元素,ArrayList基于数组实现,查询快;LinkedList基于链表,增删快。
案例1:学生成绩管理
import java.util.ArrayList;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
// 创建ArrayList集合,泛型指定元素类型为String
List<String> scores = new ArrayList<>();
// 增
scores.add("张三:95分");
scores.add("李四:88分");
scores.add("王五:76分");
scores.add(1, "赵六:92分"); // 指定位置插入
// 删
scores.remove("王五:76分"); // 按对象删除
// scores.remove(2); // 按索引删除
// 改
scores.set(1, "张三:满分100分");
// 查
String first = scores.get(0); // 按索引获取
// 遍历输出
for (String s : scores) {
System.out.println(s);
}
}
}
更新提示:Arrays.asList()返回的List长度固定,不能执行add/remove操作,需要转成ArrayList。
Set接口与去重场景实战
Set集合不允许重复元素,适合数据去重,HashSet无序但效率高,TreeSet自动排序。
案例2:用户ID去重
import java.util.HashSet;
import java.util.Set;
public class SetDemo {
public static void main(String[] args) {
Set<String> userIdSet = new HashSet<>();
// 添加重复数据时,第二个会被忽略
userIdSet.add("UID001");
userIdSet.add("UID002");
userIdSet.add("UID001"); // 不会重复存储
userIdSet.add("UID003");
System.out.println("用户总数(去重后):" + userIdSet.size());
// 判断元素是否存在
if (userIdSet.contains("UID002")) {
System.out.println("UID002用户存在");
}
// 全部清除
// userIdSet.clear();
}
}
深度思考:HashSet如何判断元素重复?
答:通过hashCode()和equals()方法,先计算hashCode,若相同再调equals,因此自定义对象去重需要重写这两个方法。
Map接口键值对存储案例
Map存储键值对,每个键唯一,HashMap性能最好,TreeMap支持排序。
案例3:商品库存管理
import java.util.HashMap;
import java.util.Map;
public class MapDemo {
public static void main(String[] args) {
// Map<商品编号, 库存量>
Map<Integer, Integer> stock = new HashMap<>();
// 添加商品
stock.put(1001, 50); // 新添加
stock.put(1002, 30);
stock.put(1001, 20); // 键重复,覆盖旧值
// 获取库存
int quantity = stock.getOrDefault(1001, 0); // 安全取值,避免null
// 遍历方式
for (Map.Entry<Integer, Integer> entry : stock.entrySet()) {
System.out.println("商品" + entry.getKey() + "库存:" + entry.getValue());
}
// 判断键或值是否存在
boolean hasKey = stock.containsKey(1003);
boolean hasValue = stock.containsValue(30);
}
}
注意:HashMap允许key和value为null,Hashtable不允许。
集合遍历的四种方式对比
不同遍历方式适用不同场景:
| 遍历方式 | 适用集合 | 特点 |
|---|---|---|
| 普通for循环 | List | 可修改元素,需索引 |
| 增强for循环 | Collection | 代码简洁,不能修改集合结构 |
| Iterator迭代器 | Collection | 可在遍历时安全删除元素 |
| forEach + Lambda | 所有集合 | Java 8+ 函数式风格 |
案例4:通用的高效遍历
// 方式1:Iterator删除元素
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String item = it.next();
if (item.startsWith("李")) {
it.remove(); // 安全删除
}
}
// 方式2:Lambda遍历
list.forEach(item -> System.out.print(item + " "));
// 方式3:Stream流操作(推荐)
list.stream()
.filter(s -> s.contains("优秀"))
.forEach(System.out::println);
集合排序与自定义比较器
Collections工具类提供排序功能,自定义对象需实现Comparable或传入Comparator。
案例5:按学生成绩排序
class Student implements Comparable<Student> {
String name;
int score;
// 构造函数、getter/setter省略
@Override
public int compareTo(Student o) {
// 升序:this.score - o.score;降序反之
return Integer.compare(this.score, o.score);
}
}
// 使用
List<Student> students = new ArrayList<>();
students.add(new Student("小明", 85));
// ... 添加更多学生
// 法1:自然排序(需实现Comparable)
Collections.sort(students);
// 法2:使用匿名Comparator(临时排序规则)
Collections.sort(students, (s1, s2) ->
s2.score - s1.score); // 按成绩降序
常见问答(FAQ)
Q1:ArrayList和Vector有什么区别?
A:Vector是线程安全的(方法加synchronized),但性能较差;ArrayList线程不安全,但性能更好,单线程环境推荐ArrayList。
Q2:如何让集合变为线程安全?
A:使用Collections.synchronizedXXX()包装,或使用CopyOnWriteArrayList、ConcurrentHashMap等并发集合类。
Q3:HashMap初始容量和加载因子是什么?
A:默认初始容量16,加载因子0.75,当元素数量超过容量*0.75时,扩容为原容量2倍。
Q4:TreeSet如何保证排序?
A:使用红黑树数据结构,元素必须实现Comparable,或在构造时传入Comparator。
Q5:List和Set如何互转?
A:List转为Set实现去重:new HashSet<>(list);Set转为List:new ArrayList<>(set)。
Q6:如何选择集合类型?
A:需要有序可重复选ArrayList/ LinkedList;需要去重选HashSet/ TreeSet;需要键值对选HashMap/ TreeMap,优先考虑ArrayList和HashMap。
通过以上案例和实践,你已经掌握了Java集合的基础使用方法。“集合操作 = 增删改查 + 遍历排序”,在项目中灵活组合使用即可,建议在IDEA中动手运行每个案例,加深理解,实际开发中还可结合Stream API、Optional等现代Java特性,大幅提升集合处理效率。