Java 集合框架详解:核心接口与常用实现类
引言
Java 集合是开发中处理数据的核心工具,提供了灵活且高效的数据存储方案。无论是企业级应用还是个人项目,深入理解集合框架都是必备技能。本文将梳理集合的基本概念、核心接口及常用实现类,并结合代码示例解析实际应用场景。
集合概述
java.util 包下的集合类主要用于存放对象。这里有几个核心概念需要注意:
- 泛型约束:集合只能存放对象。存入基本类型(如
int)时会自动装箱为包装类(如Integer)。 - 引用传递:集合中存储的是对象的引用,对象本身位于堆内存。
- 灵活性:支持不同类型和数量的数据存储。
从 JDK 5 引入泛型后,集合的类型安全性得到了显著提升。
Java 集合主要分为三大体系:
- Set:无序、不可重复的集合。
- List:有序、可重复的集合,支持索引访问。
- Map:键值对映射结构,Key 唯一,Value 可重复。
Collection 接口
Collection 是集合框架的根接口,定义了添加、删除、判断和遍历等基础操作。
基础操作
import java.util.*;
public class CollectionExample {
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
collection.add("A");
collection.add("B");
collection.add("C");
System.out.println("集合中的元素:" + collection);
// 判断是否包含某个元素
System.out.println("是否包含 A:" + collection.contains("A"));
// 删除元素
collection.remove("B");
System.out.println("删除后:" + collection);
// 清空集合
collection.clear();
System.out.println("清空后是否为空:" + collection.isEmpty());
}
}
Iterator 接口
Iterator 提供了统一的遍历方式,隐藏了底层实现的细节。JDK 5 之后,foreach 循环语法糖进一步简化了代码。
迭代器遍历
import java.util.*;
public class IteratorExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println("元素:" + element);
}
}
}
foreach 遍历
更简洁的写法如下:
for (String element : list) {
System.out.println("元素:" + element);
}
Set 接口
Set 保证元素不重复,常用于去重场景。
HashSet
基于哈希表实现,性能较高。
- 无序:不保证元素的排列顺序。
- 唯一性:依赖
equals()和hashCode()方法判断重复。 - 非线程安全:多线程环境下需额外同步。
import java.util.*;
public class HashSetExample {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("C");
set.add("A"); // 重复元素,不会添加
System.out.println("集合内容:" + set);
}
}
TreeSet
基于红黑树实现,支持排序功能。
- 自然排序:默认按元素自然顺序排列。
- 定制排序:可通过
Comparator传入比较器。
import java.util.*;
public class TreeSetExample {
public static void main(String[] args) {
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(1);
treeSet.add(2);
System.out.println("自然排序:" + treeSet);
// 降序排序
TreeSet<Integer> customSet = new TreeSet<>(Comparator.reverseOrder());
customSet.addAll(treeSet);
System.out.println("降序排序:" + customSet);
}
}
List 接口
List 允许重复元素,且通过索引定位,适合需要顺序的场景。
ArrayList
基于动态数组实现,查询快,增删慢(涉及数组复制)。
import java.util.*;
public class ArrayListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("B"); // 允许重复
System.out.println("集合内容:" + list);
System.out.println("第一个元素:" + list.get(0));
}
}
Vector
线程安全的动态数组,但性能较差,现代开发中较少使用,建议用 CopyOnWriteArrayList 或 Collections.synchronizedList 替代。
import java.util.*;
public class VectorExample {
public static void main(String[] args) {
Vector<String> vector = new Vector<>();
vector.add("A");
vector.add("B");
vector.add("C");
System.out.println("Vector 内容:" + vector);
}
}
Map 接口
Map 以键值对形式存储数据,Key 必须唯一。
HashMap
最常用的 Map 实现,基于哈希表。
import java.util.*;
public class HashMapExample {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("A", "Apple");
map.put("B", "Banana");
map.put("C", "Cherry");
System.out.println("Map 内容:" + map);
}
}
TreeMap
按键排序,适用于需要有序 Key 的场景。
import java.util.*;
public class TreeMapExample {
public static void main(String[] args) {
TreeMap<String, String> treeMap = new TreeMap<>();
treeMap.put("B", "Banana");
treeMap.put("A", "Apple");
treeMap.put("C", "Cherry");
System.out.println("排序后的 TreeMap:" + treeMap);
}
}
Collections 工具类
Collections 提供了大量静态方法,用于操作集合对象,如排序、查找、打乱等。
import java.util.*;
public class CollectionsExample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(3, 1, 2));
// 排序
Collections.sort(list);
System.out.println("排序后:" + list);
// 打乱顺序
Collections.shuffle(list);
System.out.println("打乱后:" + list);
}
}
总结
Java 集合框架涵盖了绝大多数数据存储需求。在实际开发中,根据是否需要排序、是否允许重复、是否并发安全来选择具体的实现类,能显著提升代码效率。掌握这些组件的特性与用法,是编写高质量 Java 代码的基础。
