Java集合框架主要包括两种类型的容器:集合(Collection)和 图(Map),Collection接口又有三种子类型:List、Set和Queue。每种类型都有多个具体实现类,今天我们主要学习几个常用的集合类。
Collection
List
List接口扩展自Collection,它可以定义一个允许重复的有序集合。常用的实现类有:
1.ArrayList
ArrayList是Java提供的动态数组实现,属于java.util包
import java.util.ArrayList;
ArrayList<String> list = new ArrayList<>();
其常用构造函数如下
ArrayList<E> list = new ArrayList<>(); // 默认初始容量10
ArrayList<E> list = new ArrayList<>(int capacity); // 指定初始容量
ArrayList<E> list = new ArrayList<>(Collection); // 用其他集合初始化
常用方法有
add(E e) | 添加元素 |
add(int index, E e) | 指定位置插入 |
get(int index) | 获取指定位置元素 |
set(int index, E e) | 替换指定位置元素 |
remove(int index) | 删除指定位置元素 |
remove(Object o) | 删除第一个匹配对象 |
size() | 获取元素个数 |
isEmpty() | 是否为空 |
contains(Object o) | 是否包含元素 |
clear() | 清空列表 |
indexOf(Object o) | 返回元素第一次出现位置 |
toArray() | 转换成数组 |
2.LinkedList
LinkedList是一个双向链表实现,属于java.util包,通过节点连接,每个节点包含指向前后节点的指针。
其常用构造函数如下
LinkedList<E> list = new LinkedList<>(); // 创建空链表
LinkedList(E elements[]) // 初始化链表,存储给定数组元素
LinkedList实现了List接口,也包含一些ArrayList中的常用方法如(add(),get(),size()等),除此之外,还包含以下特有方法:
addFirst(E e) | 在链表头部添加元素 |
addLast(E e) | 在链表尾部添加元素 |
removeFirst() | 删除链表头部元素 |
removeLast() | 删除链表尾部元素 |
getFirst() | 获取链表头部元素 |
getLast() | 获取链表尾部元素 |
offerFirst(E e) | 在链表头部插入元素(比 addFirst 更安全) |
offerLast(E e) | 在链表尾部插入元素 |
peekFirst() | 获取头部元素,但不删除 |
peekLast() | 获取尾部元素,但不删除 |
pollFirst() | 获取并删除头部元素 |
pollLast() | 获取并删除尾部元素 |
Set
HashSet
HashSet是Java中最常用的Set实现类,基于Hashmap实现, 不能存储重复元素,元素无序(即非插入顺序),最多只能有一个 null 元素。
import java.util.HashSet;
HashSet<String> set = new HashSet<>();
常用构造方法有
HashSet<E> set = new HashSet<>(); // 默认初始容量 16,负载因子 0.75
HashSet<E> set = new HashSet<>(int initialCapacity); // 指定容量
HashSet<E> set = new HashSet<>(int initialCapacity, float loadFactor); // 指定容量和负载因子
HashSet<E> set = new HashSet<>(Collection<? extends E> c); // 用集合创建
常用方法(继承自abstract Set)
add(E e) | 添加元素,若已存在则添加失败 |
remove(Object o) | 删除元素 |
contains(Object o) | 判断是否存在 |
size() | 返回元素个数 |
isEmpty() | 判断是否为空 |
clear() | 清空所有元素 |
iterator() | 返回迭代器 |
toArray() | 转数组 |
retainAll(Collection c) | 取交集 |
addAll(Collection c) | 并集 |
removeAll(Collection c) | 差集 |
Queue
LinkedList
这与实现List接口的LinkedList是同一个类(具体方法可向上翻),是唯一一个既实现了List又实现了Queue和Deque的类
| 项目 | List 接口视角 | Queue 接口视角 |
|---|---|---|
| 支持的操作 | 随机访问(get/set) | 队列操作(offer/poll/peek) |
| 添加元素 | add(index, E) | offer(E) |
| 获取元素 | get(index) | peek() |
| 删除元素 | remove(index) | poll() |
| 应用场景 | 有序列表 | 消息队列、任务调度 |
| 面向的接口 | List | Queue(实际上是 Deque) |
Map
HashMap
HashMap是基于HashTable实现的Map,存储键值对,允许null键和null值,非线程安全
常用方法有
Map<String, Integer> map = new HashMap<>();
map.put("apple", 5); // 添加键值对
map.get("apple"); // 获取值
map.containsKey("apple"); // 是否包含 key
map.remove("apple"); // 删除 key
map.size(); // 元素数量
map.keySet(); // 所有 key
map.values(); // 所有 value
map.entrySet(); // 所有 key-value 对
HashTable
HashTable是 Java 最早(JDK 1.0)引入的一个键值对映射容器,不允许null键或值,线程安全
常用方法如下
import java.util.Hashtable;
Hashtable<String, String> table = new Hashtable<>();
// 添加键值对
table.put("name", "Alice");
// 获取值
System.out.println(table.get("name")); // 输出:Alice
// 是否包含 key
table.containsKey("name");
// 删除键值对
table.remove("name");
// 获取所有键
table.keySet();
泛型
泛型(Generics)是 Java 中的一个机制,它允许你在类、接口、方法的定义中使用 类型参数,使得代码在编译时更加类型安全,并且可以重用类型,避免类型转换的错误。
泛型的基本语法如下:
// 定义一个泛型类
class Box<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
// 使用泛型类
Box<Integer> intBox = new Box<>();
intBox.setValue(10);
System.out.println(intBox.getValue()); // 输出: 10
通配符
在泛型中,我们还可以使用通配符来表示 不确定类型,常见的通配符有两种:
? extends T(上界通配符)
表示类型是T或T的子类型
public static void printNumbers(List<? extends Number> list) {
for (Number num : list) {
System.out.println(num);
}
}
? super T(下界通配符)
表示类型是T或T的父类型
public static void addNumbers(List<? super Integer> list) {
list.add(10); // 可以添加 Integer 或其父类类型(如 Number)
}
泛型的限制:
1.泛型类型不能为基本数据类型
2.不能直接创建一个泛型类型的数组,但可以通过 Object 类型来间接创建
3.不能使用泛型类型创建静态字段
常见泛型类型参数
| 类型 | 描述 |
|---|---|
T | Type,表示某种类型(常用) |
E | Element,表示集合中的元素(如 List<E>) |
K | Key,表示键(如 Map<K, V>) |
V | Value,表示值(如 Map<K, V>) |
N | Number,表示数字类型 |
以上就是对Java中常用集合类和泛型的学习,底层原理建议后续再深入学习,在此不多赘述,如有错误,欢迎指正!


被折叠的 条评论
为什么被折叠?



