文章目录
-
- 一、List:存储一组有顺序的数据
- 二、Set:去重
- 三、Map:键值对存储
- 四、Collections:集合工具类
- 五、Arrays:数组工具类
- 六、Optional:处理可能为空的值
- 七、Stream:处理集合数据
-
- [1. 过滤数据](#1. 过滤数据)
- [2. 转换数据](#2. 转换数据)
- [3. 分组](#3. 分组)
- 八、Objects:对象工具类
- 九、UUID:生成唯一标识
- 十、Scanner:读取控制台输入
- 十一、常用类总结
java.util 是 Java 开发中非常基础、也非常实用的工具包。
如果是日常业务开发,重点掌握下面这些就够用了:
学习这些类时,不需要死记硬背每一个方法,而是要记住它们解决什么问题:
List:存列表
Set:做去重
Map:存键值对
Collections:操作集合
Arrays:操作数组
Optional:处理空值
Stream:处理集合数据
Objects:判空和比较
UUID:生成唯一标识
Scanner:读取输入
掌握这些内容后,基本就能覆盖大部分 Java 日常开发场景。
在 Java 开发中,java.util 是一个非常常用的基础包。平时写业务代码时,经常会用到 List、Map、Set、Collections、Arrays、Optional、Stream、Objects 等工具。
这篇文章不做大而全的介绍,只整理开发中最常用、最实用的几个部分。
一、List:存储一组有顺序的数据
List 的特点是:有序、可重复。
实际开发中最常用的是 ArrayList。
java
import java.util.ArrayList;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("张三");
names.add("李四");
names.add("王五");
System.out.println(names.get(0));
for (String name : names) {
System.out.println(name);
}
}
}
常见场景:
用户列表
商品列表
查询结果列表
表格数据列表
一般情况下,列表数据优先使用:
java
List<T> list = new ArrayList<>();
二、Set:去重
Set 的特点是:元素不能重复。
常用实现类:
HashSet:不保证顺序,适合快速去重
LinkedHashSet:保留插入顺序
TreeSet:自动排序
示例:
java
import java.util.HashSet;
import java.util.Set;
public class SetDemo {
public static void main(String[] args) {
Set<String> tags = new HashSet<>();
tags.add("Java");
tags.add("Spring Boot");
tags.add("Java");
System.out.println(tags);
}
}
Set 最常见的用途就是去重:
java
List<String> list = List.of("Java", "MySQL", "Java", "Redis");
Set<String> set = new HashSet<>(list);
System.out.println(set);
三、Map:键值对存储
Map 用来保存 key-value 结构。
实际开发中最常用的是 HashMap。
java
import java.util.HashMap;
import java.util.Map;
public class MapDemo {
public static void main(String[] args) {
Map<Long, String> userMap = new HashMap<>();
userMap.put(1L, "张三");
userMap.put(2L, "李四");
System.out.println(userMap.get(1L));
}
}
常见场景:
用户ID -> 用户信息
商品ID -> 商品详情
配置名称 -> 配置值
分类ID -> 分类名称
遍历 Map:
java
userMap.forEach((id, name) -> {
System.out.println(id + ":" + name);
});
如果是在多线程场景下,可以考虑使用:
java
ConcurrentHashMap<K, V>
四、Collections:集合工具类
Collections 是专门操作集合的工具类。
常用方法:
java
List<Integer> numbers = new ArrayList<>();
numbers.add(3);
numbers.add(1);
numbers.add(2);
Collections.sort(numbers); // 排序
Collections.reverse(numbers); // 反转
Collections.shuffle(numbers); // 打乱
获取最大值、最小值:
java
Integer max = Collections.max(numbers);
Integer min = Collections.min(numbers);
常见使用场景:
列表排序
数据反转
随机打乱
获取最大值和最小值
五、Arrays:数组工具类
Arrays 用来操作数组。
java
import java.util.Arrays;
public class ArraysDemo {
public static void main(String[] args) {
int[] nums = {3, 1, 2};
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
}
}
数组转 List:
java
String[] arr = {"Java", "MySQL", "Redis"};
List<String> list = Arrays.asList(arr);
需要注意,Arrays.asList() 返回的是固定长度列表,不能直接新增或删除元素。
错误示例:
java
List<String> list = Arrays.asList("Java", "MySQL");
list.add("Redis"); // 报错
如果需要可修改列表,可以这样写:
java
List<String> list = new ArrayList<>(Arrays.asList("Java", "MySQL"));
list.add("Redis");
六、Optional:处理可能为空的值
Optional 可以用来表示一个值可能存在,也可能不存在。
传统写法:
java
String name = getName();
if (name != null) {
System.out.println(name);
}
使用 Optional:
java
Optional<String> optionalName = Optional.ofNullable(getName());
optionalName.ifPresent(name -> {
System.out.println(name);
});
设置默认值:
java
String name = Optional.ofNullable(getName())
.orElse("默认名称");
实际开发中,Optional 比较适合作为方法返回值:
java
public Optional<User> findUserById(Long id) {
return Optional.empty();
}
它可以让调用方明确知道:这个结果可能不存在。
七、Stream:处理集合数据
Stream 常用于对集合进行筛选、转换、排序、分组等操作。
1. 过滤数据
java
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
List<Integer> result = numbers.stream()
.filter(num -> num > 3)
.toList();
System.out.println(result);
2. 转换数据
java
List<String> names = List.of("java", "mysql", "redis");
List<String> result = names.stream()
.map(String::toUpperCase)
.toList();
System.out.println(result);
3. 分组
java
Map<String, List<User>> groupMap = users.stream()
.collect(Collectors.groupingBy(User::getCity));
Stream 适合处理简单的数据转换逻辑。如果逻辑很复杂,普通 for 循环反而更清晰。
八、Objects:对象工具类
Objects 常用于判空和安全比较。
java
import java.util.Objects;
String name = null;
System.out.println(Objects.isNull(name));
System.out.println(Objects.nonNull(name));
安全比较两个对象:
java
String a = null;
String b = "Java";
System.out.println(Objects.equals(a, b));
相比直接写:
java
a.equals(b);
Objects.equals(a, b) 更安全,因为不会因为 a 是 null 而抛出空指针异常。
九、UUID:生成唯一标识
UUID 可以生成一个随机唯一标识。
java
import java.util.UUID;
public class UUIDDemo {
public static void main(String[] args) {
String id = UUID.randomUUID().toString();
System.out.println(id);
}
}
去掉横线:
java
String id = UUID.randomUUID().toString().replace("-", "");
常见场景:
文件名
临时编号
请求追踪ID
测试数据ID
十、Scanner:读取控制台输入
Scanner 常用于控制台输入,在刷算法题时比较常见。
java
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
System.out.println(name);
System.out.println(age);
}
}
常用方法:
next():读取一个单词
nextLine():读取一整行
nextInt():读取 int
nextLong():读取 long
nextDouble():读取 double
不过如果输入量很大,Scanner 性能一般,可以考虑使用 BufferedReader。
十一、常用类总结
| 类或接口 | 作用 | 常见场景 |
|---|---|---|
| ArrayList | 有序列表 | 存储列表数据 |
| HashSet | 去重集合 | 数据去重 |
| HashMap | 键值对 | 根据 key 查找 value |
| Collections | 集合工具类 | 排序、反转、打乱 |
| Arrays | 数组工具类 | 数组排序、数组转 List |
| Optional | 空值处理 | 避免直接返回 null |
| Stream | 流式处理 | 筛选、转换、分组 |
| Objects | 对象工具类 | 判空、安全比较 |
| UUID | 唯一标识 | 文件名、追踪 ID |
| Scanner | 控制台输入 | 算法题、简单输入 |