Java/后端
Java容器
java容器学习,在这里进行记录。包括方法和c++类比
所有容器均在 java.util 包中,可直接 import java.util.*;。
一、ArrayList
- 导入:
import java.util.ArrayList; - 初始化:
List<String> list = new ArrayList<>(); - C++ 类似:
std::vector
| 类别 | 方法 | 说明 |
|---|---|---|
| 增 | add(e) | 添加到末尾 |
| 增 | add(index, e) | 插入到指定位置 |
| 查 | get(index) | 获取指定位置元素 |
| 查 | size() | 元素个数 |
| 查 | isEmpty() | 是否为空 |
| 查 | contains(e) | 是否包含某元素 |
| 查 | indexOf(e) | 第一次出现的索引,没有返回 -1 |
| 改 | set(index, e) | 替换指定位置元素 |
| 删 | remove(index) | 删除指定位置元素 |
| 删 | remove(Object) | 删除第一次出现的指定元素 |
| 删 | clear() | 清空所有元素 |
| 截取 | subList(from, to) | 获取子列表(左闭右开) |
| 遍历 | iterator() | 迭代器 |
| 遍历 | forEach(Consumer) | 增强 for 循环 / Lambda |
二、LinkedList
- 导入:
import java.util.LinkedList; - 初始化(当 List 用):
List<String> list = new LinkedList<>(); - 初始化(当 Deque 用):
Deque<String> deque = new LinkedList<>(); - C++ 类似:
std::list/std::deque
List 部分方法
add(e)、add(index, e)、get(index)、size()、isEmpty()、contains(e)、indexOf(e)、set(index, e)、remove(index)、remove(Object)、clear()、subList(from, to)、iterator()、forEach
—— 同上(ArrayList)
Deque 额外方法
| 类别 | 方法 | 说明 |
|---|---|---|
| 增 | addFirst(e) / offerFirst(e) | 添加到队首,功能相同 |
| 增 | addLast(e) / offerLast(e) | 添加到队尾,功能相同 |
| 增 | add(e) / offer(e) | 添加到队尾,功能相同(同 List 的 add) |
| 增 | push(e) | 压入栈顶(等价于 addFirst) |
| 删 | removeFirst() / pollFirst() | 删除并返回队首,功能相同 |
| 删 | removeLast() / pollLast() | 删除并返回队尾,功能相同 |
| 删 | remove() / poll() | 删除并返回队首,功能相同 |
| 删 | pop() | 弹出栈顶(等价于 removeFirst) |
| 查 | getFirst() / peekFirst() | 获取队首,功能相同 |
| 查 | getLast() / peekLast() | 获取队尾,功能相同 |
| 查 | peek() | 获取队首,功能相同 |
| 查 | element() | 获取队首,功能相同 |
三、HashSet
- 导入:
import java.util.HashSet; - 初始化:
Set<String> set = new HashSet<>(); - C++ 类似:
std::unordered_set
| 类别 | 方法 | 说明 |
|---|---|---|
| 增 | add(e) | 添加元素,已存在则返回 false |
| 删 | remove(e) | 删除指定元素 |
| 删 | clear() | 清空 |
| 查 | contains(e) | 是否包含某元素 |
| 查 | size() | 元素个数 |
| 查 | isEmpty() | 是否为空 |
| 遍历 | iterator() | 迭代器 |
| 遍历 | forEach(Consumer) | Lambda 遍历 |
四、TreeSet
- 导入:
import java.util.TreeSet; - 初始化:
Set<String> set = new TreeSet<>(); - C++ 类似:
std::set
Set 部分方法
add(e)、remove(e)、contains(e)、size()、isEmpty()、clear()、iterator()、forEach
—— 同上(HashSet)
有序额外方法
| 方法 | 说明 |
|---|---|
first() | 最小元素 |
last() | 最大元素 |
headSet(e) | 小于 e 的所有元素(左闭右开) |
tailSet(e) | 大于等于 e 的所有元素 |
subSet(from, to) | 范围 [from, to) |
ceiling(e) | 大于等于 e 的最小元素 |
floor(e) | 小于等于 e 的最大元素 |
higher(e) | 严格大于 e 的最小元素 |
lower(e) | 严格小于 e 的最大元素 |
五、HashMap
- 导入:
import java.util.HashMap; - 初始化:
Map<String, Integer> map = new HashMap<>(); - C++ 类似:
std::unordered_map
| 类别 | 方法 | 说明 |
|---|---|---|
| 增 / 改 | put(k, v) | 放入键值对,键存在则覆盖 |
| 增 / 改 | putIfAbsent(k, v) | 键不存在时才放入 |
| 查 | get(k) | 获取值,不存在返回 null |
| 查 | getOrDefault(k, def) | 获取值,不存在返回默认值 def |
| 查 | containsKey(k) | 是否包含键 |
| 查 | containsValue(v) | 是否包含值 |
| 查 | size() | 键值对数量 |
| 查 | isEmpty() | 是否为空 |
| 删 | remove(k) | 删除键并返回对应值 |
| 删 | remove(k, v) | 仅当键值都匹配才删除 |
| 删 | clear() | 清空 |
| 遍历 | keySet() | 所有键的 Set |
| 遍历 | values() | 所有值的 Collection |
| 遍历 | entrySet() | 所有键值对的 Set |
| 遍历 | forEach((k, v) -> ...) | Lambda 遍历 |
六、TreeMap
- 导入:
import java.util.TreeMap; - 初始化:
Map<String, Integer> map = new TreeMap<>(); - C++ 类似:
std::map
Map 部分方法
put(k, v)、putIfAbsent(k, v)、get(k)、getOrDefault(k, def)、containsKey(k)、containsValue(v)、remove(k)、remove(k, v)、size()、isEmpty()、clear()、keySet()、values()、entrySet()、forEach
—— 同上(HashMap)
有序额外方法
| 方法 | 说明 |
|---|---|
firstKey() | 最小键 |
lastKey() | 最大键 |
headMap(k) | 键小于 k 的所有键值对(左闭右开) |
tailMap(k) | 键大于等于 k 的所有键值对 |
subMap(k1, k2) | 键范围 [k1, k2) |
ceilingKey(k) | 大于等于 k 的最小键 |
floorKey(k) | 小于等于 k 的最大键 |
higherKey(k) | 严格大于 k 的最小键 |
lowerKey(k) | 严格小于 k 的最大键 |
附:快速创建不可变集合(Java 9+)
List<String> list = List.of("a", "b", "c");Set<String> set = Set.of("a", "b", "c");Map<String, Integer> map = Map.of("a", 1, "b", 2);
注意:这些集合不可变,不能增删改。