Java集合框架核心概览:深入理解List、Set与Map
在Java编程中,集合框架是处理对象组的核心工具。它提供了一套标准化的接口和类,用于存储、管理和操作数据。Java集合框架主要由两个根接口派生:Collection 和 Map,它们各自定义了不同的数据存储和访问方式。
Collection接口:用于存储一组不具备键值关系的对象。它又细分为:List接口:代表有序的集合,元素可以重复。其实现类如ArrayList、LinkedList等。Set接口:代表无序的集合,不允许重复元素。其实现类如HashSet、TreeSet等。
Map接口:用于存储键值对(Key-Value Pair),其中键(Key)必须是唯一的,值(Value)可以重复。其实现类如HashMap、TreeMap、LinkedHashMap等。
下图展示了Java集合框架的主要继承关系,有助于理解各接口和实现类之间的联系:

Collection接口与迭代器(Iterator)
Collection 是Java集合框架中所有单值集合的父接口,它定义了添加、删除、检查元素等基本操作。遍历 Collection 中元素最常用的方式是使用 Iterator 迭代器。
示例:HashSet - 无序且不含重复元素
HashSet 是 Set 接口的一个典型实现,它不保证元素的顺序,并且不允许存储重复元素。尝试添加重复元素时,HashSet 会忽略该操作。
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
public class SetTraversalDemo {
public static void main(String[] args) {
Collection<String> uniqueItems = new HashSet<>();
uniqueItems.add("Alpha");
uniqueItems.add("Beta");
uniqueItems.add("Gamma");
uniqueItems.add("Delta");
uniqueItems.add("Epsilon");
uniqueItems.add("Beta"); // 尝试添加重复元素,将被忽略
System.out.println("--- HashSet 遍历结果 (顺序不确定) ---");
Iterator<String> itemIterator = uniqueItems.iterator();
while (itemIterator.hasNext()) {
System.out.println(itemIterator.next());
}
}
}
输出结果(请注意元素的顺序可能与添加顺序不同,且"Beta"只出现一次):

示例:LinkedList - 有序且允许重复元素
LinkedList 是 List 接口的实现,它基于双向链表结构。LinkedList 保持元素的添加顺序,并且允许存储重复元素。
import java.util.Collection;
import java.util.LinkedList;
import java.util.Iterator;
public class LinkedListTraversalDemo {
public static void main(String[] args) {
Collection<String> orderedItems = new LinkedList<>();
orderedItems.add("First");
orderedItems.add("Second");
orderedItems.add("Third");
orderedItems.add("Fourth");
orderedItems.add("Fifth");
orderedItems.add("Second"); // 允许添加重复元素
System.out.println("--- LinkedList 遍历结果 (保持添加顺序) ---");
Iterator<String> listIterator = orderedItems.iterator();
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
}
}
输出结果:

示例:ArrayList - 有序且允许重复元素
ArrayList 也是 List 接口的实现,它基于动态数组。与 LinkedList 类似,ArrayList 也保持元素的添加顺序,并允许重复。
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListTraversalDemo {
public static void main(String[] args) {
Collection<String> dynamicArrayItems = new ArrayList<>();
dynamicArrayItems.add("ItemA");
dynamicArrayItems.add("ItemB");
dynamicArrayItems.add("ItemC");
dynamicArrayItems.add("ItemD");
dynamicArrayItems.add("ItemE");
dynamicArrayItems.add("ItemB"); // 允许添加重复元素
System.out.println("--- ArrayList 遍历结果 (保持添加顺序) ---");
Iterator<String> arrayIterator = dynamicArrayItems.iterator();
while (arrayIterator.hasNext()) {
System.out.println(arrayIterator.next());
}
}
}
输出结果:

存储自定义对象与迭代
集合不仅可以存储Java内置类型(如 String),也可以存储我们自定义的对象。当存储自定义对象时,通常需要重写对象的 toString() 方法,以便在打印时能显示有意义的信息。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
// 定义一个学生类
class Student {
private String studentName;
private String gender;
public Student(String studentName, String gender) {
this.studentName = studentName;
this.gender = gender;
}
public String getStudentName() {
return studentName;
}
public String getGender() {
return gender;
}
// 重写 toString() 方法,便于打印对象信息
@Override
public String toString() {
return "学生姓名:" + studentName + ",性别:" + gender;
}
}
public class CustomObjectCollectionDemo {
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>(); // 使用泛型指定存储Student对象
studentList.add(new Student("张明", "男"));
studentList.add(new Student("李华", "女"));
studentList.add(new Student("王磊", "男"));
studentList.add(new Student("赵丽", "女"));
System.out.println("--- 遍历学生列表 ---");
Iterator<Student> studentIterator = studentList.iterator();
while (studentIterator.hasNext()) {
Student currentStudent = studentIterator.next(); // 使用泛型后无需强制类型转换
System.out.println(currentStudent); // 自动调用Student的toString()方法
}
}
}
增强型for循环 (For-Each Loop)
自JDK 1.5起,Java引入了增强型for循环(也称为for-each循环),它简化了数组和集合的遍历操作,使代码更简洁易读。这种循环适用于任何实现了 Iterable 接口的对象(包括所有 Collection 实现类)以及数组。
import java.util.ArrayList;
import java.util.Collection;
public class EnhancedForLoopDemo {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50};
System.out.println("--- 传统for循环遍历数组 ---");
for (int i = 0; i < numbers.length; i++) {
System.out.println("元素:" + numbers[i]);
}
System.out.println();
System.out.println("--- 增强型for循环遍历数组 ---");
for (int num : numbers) {
System.out.println("元素:" + num);
}
System.out.println();
Collection<String> fruitBasket = new ArrayList<>();
fruitBasket.add("Apple");
fruitBasket.add("Banana");
fruitBasket.add("Cherry");
fruitBasket.add("Date");
System.out.println("--- 增强型for循环遍历集合 ---");
for (String fruit : fruitBasket) {
System.out.println("水果:" + fruit);
}
}
}
Collections工具类:List的实用操作
java.util.Collections 是一个工具类,提供了大量静态方法,用于对各种集合(特别是 List)进行排序、搜索、修改等操作。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ListUtilityOperations {
public static void main(String[] args) {
List<String> shoppingList = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
shoppingList.add("Item-" + i);
}
shoppingList.add("Item-1"); // 添加一个重复项
System.out.println("原始列表: " + shoppingList);
// 逆序排列
Collections.reverse(shoppingList);
System.out.println("逆序后: " + shoppingList);
// 随机打乱顺序
Collections.shuffle(shoppingList);
System.out.println("打乱顺序后: " + shoppingList);
// 排序 (按自然顺序或自定义比较器)
Collections.sort(shoppingList);
System.out.println("排序后: " + shoppingList);
// 二分查找 (列表必须是有序的,否则结果不可预测)
int index = Collections.binarySearch(shoppingList, "Item-3");
System.out.println("'Item-3' 的位置 (基于二分查找): " + index);
index = Collections.binarySearch(shoppingList, "NonExistent");
System.out.println("'NonExistent' 的位置 (不存在): " + index); // 返回负值
}
}
输出结果:
