想象你正在管理一个班级的学生信息:
如果用基本数据类型表示:
// 混乱的管理方式
String[] names = new String[50]; // 学生姓名
int[] scores = new int[50]; // 学生成绩
// 添加学生 删除学生 查找学生
集合框架就是为解决这类问题而生的工具箱,它提供:
特点:
// 创建ArrayList
List fruits = new ArrayList<>();
// 添加元素
fruits.add("Apple");
fruits.add("Banana");
fruits.add(1, "Orange"); // 在索引1插入
// 访问元素
String first = fruits.get(0); // "Apple"
// 遍历
for (String fruit : fruits) {
System.out.println(fruit);
}
// 删除元素
fruits.remove("Banana");
fruits.remove(0);
特点:
// 创建LinkedList
List numbers = new LinkedList<>();
// 添加元素
numbers.add(10);
numbers.addFirst(5); // 头部添加
numbers.addLast(15); // 尾部添加
// 访问
int first = numbers.getFirst(); // 5
// 删除
numbers.removeFirst(); // 删除5
替代方案:
// 使用Collections工具类
List syncList = Collections.synchronizedList(new ArrayList<>());
// 或使用CopyOnWriteArrayList(读多写少场景)
List safeList = new CopyOnWriteArrayList<>();
特点:
Set ids = new HashSet<>();
// 添加元素
ids.add("A001");
ids.add("A002");
ids.add("A001"); // 重复,不会被添加
System.out.println(ids); // [A001, A002] 顺序不确定
// 检查存在
boolean exists = ids.contains("A001"); // true
特点:
Set orderedSet = new LinkedHashSet<>();
orderedSet.add("First");
orderedSet.add("Second");
orderedSet.add("Third");
System.out.println(orderedSet); // [First, Second, Third]
特点:
Set sortedNumbers = new TreeSet<>();
sortedNumbers.add(5);
sortedNumbers.add(2);
sortedNumbers.add(8);
System.out.println(sortedNumbers); // [2, 5, 8]
// 获取范围
Set subset = ((TreeSet) sortedNumbers).subSet(3, 7); // [5]
Queue queue = new LinkedList<>();
// 入队
queue.offer("Task1");
queue.offer("Task2");
// 出队
String task = queue.poll(); // "Task1"
// 查看队首
String next = queue.peek(); // "Task2"
特点:
// 创建优先级队列(最小堆)
Queue pq = new PriorityQueue<>();
pq.offer(10);
pq.offer(5);
pq.offer(15);
System.out.println(pq.poll()); // 5
System.out.println(pq.poll()); // 10
// 自定义排序(最大堆)
Queue maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
maxHeap.offer(10);
maxHeap.offer(5);
maxHeap.offer(15);
System.out.println(maxHeap.poll()); // 15
特点:
Deque deque = new ArrayDeque<>();
// 栈操作
deque.push("First");
deque.push("Second");
System.out.println(deque.pop()); // "Second"
// 队列操作
deque.offerLast("Third");
System.out.println(deque.pollFirst()); // "First"
特点:
Map scores = new HashMap<>();
// 添加键值对
scores.put("Alice", 90);
scores.put("Bob", 85);
scores.put("Charlie", 95);
// 获取值
int aliceScore = scores.get("Alice"); // 90
// 遍历
for (Map.Entry entry : scores.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
// 检查键是否存在
boolean hasBob = scores.containsKey("Bob"); // true
Map orderedScores = new LinkedHashMap<>();
orderedScores.put("Alice", 90);
orderedScores.put("Bob", 85);
orderedScores.put("Charlie", 95);
System.out.println(orderedScores); // {Alice=90, Bob=85, Charlie=95}
特点:
Map sortedScores = new TreeMap<>();
sortedScores.put("Bob", 85);
sortedScores.put("Alice", 90);
sortedScores.put("Charlie", 95);
System.out.println(sortedScores); // {Alice=90, Bob=85, Charlie=95}
// 获取子映射
Map subMap = ((TreeMap) sortedScores)
.subMap("A", "C"); // {Alice=90, Bob=85}
List numbers = Arrays.asList(5, 2, 8, 1);
// 排序
Collections.sort(numbers); // [1, 2, 5, 8]
// 二分查找
int index = Collections.binarySearch(numbers, 5); // 2
// 反转
Collections.reverse(numbers); // [8, 5, 2, 1]
// 洗牌
Collections.shuffle(numbers); // 随机顺序
// 创建不可变集合
List immutable = Collections.unmodifiableList(new ArrayList<>());
List colors = Arrays.asList("Red", "Green", "Blue");
// 使用迭代器遍历
Iterator it = colors.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// 删除元素
Iterator it2 = colors.iterator();
while (it2.hasNext()) {
if (it2.next().equals("Green")) {
it2.remove(); // 安全删除
}
}
// 定义泛型类
class Box {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
// 使用
Box stringBox = new Box<>();
stringBox.setContent("Hello");
Box intBox = new Box<>();
intBox.setContent(100);
List students = new ArrayList<>();
students.add(new Student("Alice", 90));
students.add(new Student("Bob", 85));
students.add(new Student("Charlie", 95));
// 按分数降序排序
Collections.sort(students, new Comparator() {
@Override
public int compare(Student s1, Student s2) {
return s2.getScore() - s1.getScore();
}
});
// Lambda简化
Collections.sort(students, (s1, s2) -> s2.getScore() - s1.getScore());
需求 | 推荐实现 |
---|---|
快速随机访问 | ArrayList |
频繁增删 | LinkedList |
去重 | HashSet |
有序去重 | LinkedHashSet |
排序 | TreeSet |
键值对存储 | HashMap |
有序键值对 | LinkedHashMap |
排序键值对 | TreeMap |
高并发 | ConcurrentHashMap |
特性 | HashMap | Hashtable |
---|---|---|
线程安全 | 否 | 是 |
性能 | 高 | 低 |
null键 | 允许 | 不允许 |
迭代器 | fail-fast | fail-safe |