在 Java 算法刷题和日常开发中,HashMap、HashSet、ArrayList 是使用率最高的三个集合工具,堪称「刷题三巨头」。本文整理了它们的基础用法、核心方法、高频场景、易错点,纯干货无废话,背会就能直接上手写代码!

一、HashMap 键值对映射神器

核心特点

  • 存储结构:key-value 键值对,key 唯一、value 可重复
  • 性能:增删改查均为 O (1),效率拉满
  • 特性:无序,不保证存储顺序

1. 基础创建

泛型指定键和值的类型,支持任意引用类型:

// 字符为键,整数为值(常用:字符计数)
HashMap<Character, Integer> map = new HashMap<>();
// 整数为键,整数为值(常用:数字计数)
HashMap<Integer, Integer> map = new HashMap<>();

2. 核心常用方法(刷题必背)

方法 作用 关键特性
put(key, value) 存入键值对 键重复时覆盖旧值
get(key) 根据键取值 键不存在返回 null
getOrDefault(key, 默认值) 安全取值 键不存在返回默认值,避免空指针(刷题首选)
containsKey(key) 判断键是否存在 返回 boolean 值
remove(key) 删除指定键的键值对 直接删除,无返回值
isEmpty() 判断是否为空 空返回 true
size() 获取键值对数量 返回 int 类型

代码示例

map.put('a', 1); // 存值
Integer val = map.get('a'); // 取值
map.getOrDefault('b', 0); // 无'b',返回0
if(map.containsKey('a')){} // 判断键存在

3. 三种遍历方式

// 1. 遍历所有key(最常用)
for(char k : map.keySet()){}

// 2. 遍历所有value
for(int v : map.values()){}

// 3. 键值对一起遍历
for(Map.Entry<Character,Integer> entry : map.entrySet()){
    char k = entry.getKey();
    int v = entry.getValue();
}

4. 刷题万能计数模板

所有频次统计、异位词、重复数题目直接套:

// 元素计数+1
map.put(c, map.getOrDefault(c, 0) + 1);
// 元素计数-1
map.put(c, map.get(c) - 1);

5. 高频易错点

  1. 比较内容不能用 ==,必须用 equals()
  2. get(key) 无结果返回 null,int 接收会报错 → 优先用 getOrDefault
  3. HashMap 无序,需要有序用 LinkedHashMap

二、HashSet 去重 & 存在判断神器

核心特点

  • 存储结构:单个元素,无键值对
  • 核心特性:元素不重复、无序
  • 性能:查询 O (1),专门用于去重和存在性判断

1. 基础创建

import java.util.HashSet;
import java.util.Set;

// 字符集合
Set<Character> set = new HashSet<>();
// 整数集合
Set<Integer> set = new HashSet<>();

2. 核心常用方法(必背)

方法 作用 关键特性
add(元素) 添加元素 重复元素自动忽略
contains(元素) 判断元素是否存在 返回 boolean(刷题高频)
remove(元素) 删除指定元素 直接删除
isEmpty() 判断是否为空 空返回 true
size() 获取元素个数 返回 int
clear() 清空所有元素 无返回值

代码示例

set.add('a'); // 添加元素
if(set.contains('a')){} // 判断存在
set.remove('b'); // 删除元素

3. 常用遍历

// 增强for循环(最简单)
for(char c : set){ }

4. 刷题高频场景

  • 数组 / 字符串去重
  • 判断是否包含重复元素
  • 快速校验元素是否存在

5. HashSet vs HashMap(必考)

  • HashSet:存单个元素,用于去重、判断存在
  • HashMap:存键值对,用于统计次数、数据映射

三、ArrayList 动态数组神器

核心特点

  • 对比普通数组:长度动态可变,自动扩容
  • 底层:动态数组,支持下标访问
  • 注意:只能存引用类型,基本类型用包装类(Integer/Character)

1. 基础创建

import java.util.ArrayList;
import java.util.List;

// 整数动态数组
List<Integer> list = new ArrayList<>();
// 字符动态数组
List<Character> list = new ArrayList<>();
// 字符串动态数组
List<String> list = new ArrayList<>();

2. 核心常用方法(刷题天花板)

新增元素
  • add(e):末尾添加元素,返回 boolean
  • add(index, e):指定下标插入元素
list.add(3); // 末尾加3
list.add(1, 5); // 下标1处插入5
获取 & 修改元素
  • get(index):获取指定下标元素
  • set(index, e):修改指定下标元素,返回被替换的旧值
int num = list.get(0); // 取下标0
int old = list.set(0, 99); // 修改下标0为99
删除元素(高频易错)
  • remove(int index)按下标删除,返回被删元素
  • remove(Object o)按元素删除,返回 boolean
int del = list.remove(0); // 删除下标0
boolean ok = list.remove((Integer)5); // 删除元素5
其他常用方法
方法 作用
size() 获取元素个数
isEmpty() 判断是否为空
contains() 判断元素是否存在
indexOf() 获取元素第一个下标,无则返回 - 1
clear() 清空集合

3. 数组 ↔ ArrayList 互转(算法高频)

// 1. 数组转ArrayList(遍历添加)
int[] arr = {1,2,3};
List<Integer> list = new ArrayList<>();
for(int num : arr){ list.add(num); }

// 2. ArrayList转数组
Integer[] arr = list.toArray(new Integer[0]);

4. 极简总结

  1. add(e) → 末尾添加
  2. get(i) → 下标取值
  3. set(i,e) → 修改元素
  4. remove(i) → 按下标删
  5. remove(obj) → 按元素删
  6. size() → 查长度
  7. contains() → 判存在

总结

这三个集合是 Java 刷题的「基础骨架」:

  • 统计次数、存映射 → 用 HashMap
  • 去重、判存在 → 用 HashSet
  • 动态存数据、下标访问 → 用 ArrayList

熟记本文的方法和场景,算法题和开发代码直接秒写!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐