Java 容器详解—— 常用容器类入门

Java 容器详解—— 常用容器类入门

本文从零开始讲解 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 = new ArrayList<>();

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 = new HashSet<>();

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 = new HashMap<>();

map.put("Tom", 85);

map.put("Jerry", 90);

System.out.println("Tom的成绩:" + map.get("Tom"));

for (Map.Entry entry : map.entrySet()) {

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 = new ArrayList<>();

list.add("Java");

list.add("Python");

list.add("C++");

Iterator iterator = list.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 = new ArrayList<>();

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 elements;

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(双端队列)作为底层结构,推荐使用 ArrayDeque;

例如:

import java.util.ArrayDeque;

import java.util.Deque;

public class StringStack {

private Deque stack = new ArrayDeque<>();

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 容器的整体认识,并为后续学习集合进阶内容打下坚实的基础。

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、分享!如有疑问,欢迎留言交流。

相关推荐

88财富:再见了~即将关闭网站
365网站客服电话

88财富:再见了~即将关闭网站

📅 09-17 👁️ 6452
探究AMD HD7970显卡的性能表现?i7970配什么主
谁有365体育投注网址

探究AMD HD7970显卡的性能表现?i7970配什么主

📅 08-17 👁️ 6870
怎么看自己录取详情信息?录取状态怎么查最快?
谁有365体育投注网址

怎么看自己录取详情信息?录取状态怎么查最快?

📅 09-07 👁️ 1263