本文从零开始讲解 Java 中的容器(集合)体系,包括 List、Set、Map 等核心接口和实现类,是 Java 容器知识的全面总结。通过学习本篇文章,你将掌握 Java 容器的基本结构与使用方法,并能根据实际需求选择合适的容器类型。
一、什么是 Java 容器?
在 Java 编程中,容器(Container) 是用来存储和管理多个对象的结构。Java 提供了一套功能强大的容器类库 —— Java Collection Framework(JCF),位于 java.util 包中。
容器的作用:
存储一组对象(元素)提供对这些对象的增删改查操作支持遍历、排序、查找等常见操作拥有不同特性以适应不同的业务场景
二、Java 容器体系结构
Java 容器主要包括两大类:
类型接口/类特点单列集合Collection 接口及其实现类(如 List、Set)存储独立的元素双列集合Map 接口及其实现类(如 HashMap、TreeMap)存储键值对(Key-Value)
它们之间的关系如下:
Collection
├── List:有序、可重复
├── Set:无序、不可重复
└── Queue:队列结构(先进先出)
Map
├── HashMap:基于哈希表
├── TreeMap:基于红黑树,按键排序
└── LinkedHashMap:保持插入顺序
三、常用的容器类介绍与使用
1. List 接口(有序、可重复)
List 是一个有序的集合,允许元素重复,并可以通过索引访问。
常用实现类:
ArrayList:基于动态数组实现,查询快,增删慢。LinkedList:基于链表实现,增删快,查询慢。
示例代码:
import java.util.ArrayList;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
List
list.add("Apple");
list.add("Banana");
list.add("Orange");
System.out.println("元素个数:" + list.size());
System.out.println("第二个元素:" + list.get(1));
}
}
2. Set 接口(无序、不重复)
Set 是一个不允许重复元素的集合,常用于去重。
常用实现类:
HashSet:基于哈希表实现,无序但效率高。LinkedHashSet:保持插入顺序。TreeSet:自动排序。
示例代码:
import java.util.HashSet;
import java.util.Set;
public class SetDemo {
public static void main(String[] args) {
Set
set.add("A");
set.add("B");
set.add("A"); // 重复元素不会被添加
System.out.println("元素数量:" + set.size());
for (String s : set) {
System.out.print(s + " ");
}
}
}
3. Map 接口(键值对集合)
Map 用于存储键值对(Key-Value),每个键只能对应一个值。
常用实现类:
HashMap:基于哈希表,性能好,但不保证顺序。TreeMap:按键排序。LinkedHashMap:按插入或访问顺序排列。
示例代码:
import java.util.HashMap;
import java.util.Map;
public class MapDemo {
public static void main(String[] args) {
Map
map.put("Tom", 85);
map.put("Jerry", 90);
System.out.println("Tom的成绩:" + map.get("Tom"));
for (Map.Entry
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
}
}
四、迭代器 Iterator 的使用
Iterator 是 Java 集合框架中专门用于遍历集合的工具类,适用于所有实现了 Collection 接口的容器。
示例代码:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorDemo {
public static void main(String[] args) {
List
list.add("Java");
list.add("Python");
list.add("C++");
Iterator
while (iterator.hasNext()) {
String lang = iterator.next();
System.out.println(lang);
}
}
}
五、通过查询帮助文档学习 JDK API
在 Java 开发中,我们经常需要查阅官方 API 文档来了解某个类或方法的功能和使用方式。Oracle 官方提供了完整的 JDK API 文档,是学习 Java 不可或缺的资源。
以 indexOf() 方法为例
假设我们想查找某个元素在 List 中的位置,可以使用 indexOf(Object o) 方法。
步骤如下:
打开 JDK 17 API 文档首页在搜索框输入 List,点击进入 java.util.List 接口页面查找方法列表中的 indexOf(Object o) 方法查看说明:
Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.
使用示例:
import java.util.ArrayList;
import java.util.List;
public class IndexOfDemo {
public static void main(String[] args) {
List
list.add("Apple");
list.add("Banana");
list.add("Orange");
int index = list.indexOf("Banana");
if (index != -1) {
System.out.println("Banana 的位置是:" + index);
} else {
System.out.println("Banana 不存在于列表中");
}
}
}
输出结果:
Banana 的位置是:1
通过查阅官方文档,我们可以准确地了解每个方法的功能、返回值含义以及可能抛出的异常信息,从而写出更安全、规范的代码。
六、实战练习:自定义字符串栈 StringStack
下面我们将通过一个实例来加深对容器的理解:实现一个字符串栈 StringStack,支持基本的入栈 (push) 和出栈 (pop) 操作。
题目描述
编写一个名为 StringStack 的类,内部使用 List
void push(String item):将元素压入栈顶;String pop():弹出栈顶元素并返回;boolean isEmpty():判断栈是否为空;int size():返回栈中元素个数;
示例主函数
public class Main {
public static void main(String[] args) {
StringStack stack = new StringStack();
stack.push("Hello");
stack.push("World");
System.out.println(stack.pop()); // World
System.out.println(stack.pop()); // Hello
System.out.println(stack.isEmpty()); // true
}
}
实现代码
import java.util.ArrayList;
import java.util.List;
public class StringStack {
private List
public StringStack() {
elements = new ArrayList<>();
}
public void push(String item) {
elements.add(item); // 添加到末尾,模拟栈顶
}
public String pop() {
if (isEmpty()) {
throw new IllegalStateException("栈为空,无法出栈");
}
return elements.remove(elements.size() - 1); // 移除最后一个元素
}
public boolean isEmpty() {
return elements.isEmpty();
}
public int size() {
return elements.size();
}
}
补充说明
使用 ArrayList 实现栈是因为其尾部插入和删除操作的时间复杂度为 O(1);也可以使用 Deque
例如:
import java.util.ArrayDeque;
import java.util.Deque;
public class StringStack {
private Deque
public void push(String item) {
stack.push(item); // Deque 的 push 方法
}
public String pop() {
return stack.pop(); // 出栈
}
public boolean isEmpty() {
return stack.isEmpty();
}
public int size() {
return stack.size();
}
}
七、选择合适容器的建议
使用场景推荐容器元素需要按顺序存储并频繁访问ArrayList经常进行插入删除操作LinkedList不允许重复元素HashSet需要按键排序TreeMap需要键值对结构HashMap需要栈结构ArrayDeque(推荐)、ArrayList需要保留插入顺序LinkedHashSet / LinkedHashMap
八、结语
Java 容器是 Java 编程中最基础也最重要的部分之一。通过合理使用 List、Set 和 Map,我们可以高效地处理各种数据结构问题。同时,学会查阅官方 API 文档,也是提升编程能力的重要一步。
希望本篇文章能够帮助你建立起对 Java 容器的整体认识,并为后续学习集合进阶内容打下坚实的基础。
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、分享!如有疑问,欢迎留言交流。