Java后端常用内置工具类盘点
·
Java 后端开发中,JDK 自带的工具类提供了基础且强大的功能,是日常编码的基石。这些工具类覆盖了集合操作、字符串处理、日期时间处理、数学计算、并发控制等多个核心领域,正确使用它们可以极大提升开发效率和代码质量 。
下面以表格形式分类列举最常用和重要的 JDK 自带工具类,并附上关键代码示例。
一、集合框架工具类 (java.util 包)
这是使用最频繁的工具类集合,用于操作和处理 Collection 和 Map。
| 类名 | 主要功能 | 典型应用场景 |
|---|---|---|
Collections | 提供操作 Collection 的静态方法,如排序、查找、同步包装、不可变集合等。 | 集合排序、创建线程安全视图、返回空集合以避免NPE。 |
Arrays | 提供操作数组的静态方法,如排序、搜索、比较、填充、转换为列表等。 | 数组处理、数组与列表的转换。 |
Objects | 提供对象操作的工具方法,如空值安全的比较、哈希计算、判空等。 | 安全地比较两个对象、生成 hashCode、防止空指针异常。 |
代码示例:Collections 和 Arrays 的使用
import java.util.*;
public class CollectionUtilsDemo {
public static void main(String[] args) {
// 1. Collections 示例
List<Integer> numbers = new ArrayList<>(Arrays.asList(3, 1, 4, 1, 5, 9));
// 排序
Collections.sort(numbers); // 升序排序
System.out.println("排序后: " + numbers); // 输出: [1, 1, 3, 4, 5, 9]
// 获取线程安全集合(包装)
List<Integer> syncList = Collections.synchronizedList(numbers);
// 获取不可修改集合
List<Integer> unmodifiableList = Collections.unmodifiableList(numbers);
// 2. Arrays 示例
String[] strArray = {"Java", "Python", "Go"};
// 数组排序
Arrays.sort(strArray);
// 数组转List (返回的List是Arrays的内部类,不支持结构性修改)
List<String> listFromArray = Arrays.asList(strArray);
System.out.println("数组转List: " + listFromArray);
// 3. Objects 示例
String str1 = null;
String str2 = "Hello";
// 安全的equals比较,避免NPE
boolean isEqual = Objects.equals(str1, str2); // false
// 要求非空,否则抛出NPE
String nonNullStr = Objects.requireNonNull(str2, "参数不能为null");
}
}
二、字符串处理类 (java.lang 包)
字符串是后端开发中最常见的数据类型,相关工具类至关重要。
| 类名 | 主要功能 | 典型应用场景 |
|---|---|---|
String | 本身提供大量操作方法,如 split, substring, indexOf, format 等。 | 字符串切割、拼接、匹配、格式化。 |
StringBuilder / StringBuffer | 可变字符序列,用于高效拼接字符串。StringBuilder 非线程安全,性能更高;StringBuffer 线程安全。 | 在循环或复杂逻辑中动态构建字符串。 |
StringJoiner (Java 8+) | 用于构造由分隔符分隔的字符序列,并可选择性地添加前缀和后缀。 | 方便地拼接集合元素为字符串,如 SQL IN 条件。 |
代码示例:字符串工具使用
import java.util.StringJoiner;
public class StringUtilsDemo {
public static void main(String[] args) {
// 1. StringBuilder 示例(性能优于字符串直接相加)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 5; i++) {
sb.append("Item").append(i).append(";");
}
String result = sb.toString();
System.out.println("StringBuilder 结果: " + result);
// 2. StringJoiner 示例(清晰优雅地拼接)
StringJoiner sj = new StringJoiner(", ", "[", "]");
sj.add("Alice").add("Bob").add("Charlie");
System.out.println("StringJoiner 结果: " + sj.toString()); // 输出: [Alice, Bob, Charlie]
// 3. String 的 format 方法(格式化输出)
String formatted = String.format("用户: %s, 年龄: %d, 余额: %.2f", "张三", 25, 99.987);
System.out.println("String.format 结果: " + formatted);
}
}
三、日期时间 API (java.time 包, Java 8+)
Java 8 引入的新日期时间 API (java.time) 彻底解决了旧 Date 和 Calendar 的缺陷,是当前开发标准。
| 类名 | 主要功能 | 典型应用场景 |
|---|---|---|
LocalDate | 只包含日期,不包含时间。 | 生日、纪念日等只需要日期的场景。 |
LocalTime | 只包含时间,不包含日期。 | 营业时间、课程表时间。 |
LocalDateTime | 包含日期和时间。 | 数据的创建时间、更新时间。 |
ZonedDateTime | 包含时区的日期时间。 | 跨时区的系统,如国际航班时刻。 |
Instant | 时间戳,表示自1970-01-01T00:00:00Z开始的纳秒。 | 记录事件发生的机器时间戳。 |
Duration | 表示两个时间点之间的间隔(基于时间)。 | 计算两个时刻之间的秒、纳秒差。 |
Period | 表示两个日期之间的间隔(基于日期)。 | 计算两个日期之间的年、月、日差。 |
DateTimeFormatter | 日期时间的格式化和解析。 | 将 LocalDateTime 转换为指定格式的字符串,或反向解析。 |
代码示例:Java 8 日期时间 API
import java.time.*;
import java.time.format.DateTimeFormatter;
public class DateTimeDemo {
public static void main(String[] args) {
// 1. 获取当前日期和时间
LocalDate today = LocalDate.now();
LocalTime now = LocalTime.now();
LocalDateTime currentDateTime = LocalDateTime.now();
System.out.println("今天日期: " + today);
System.out.println("当前时间: " + now);
System.out.println("当前日期时间: " + currentDateTime);
// 2. 创建指定日期时间
LocalDate birthDate = LocalDate.of(1990, Month.AUGUST, 15);
LocalDateTime meetingTime = LocalDateTime.of(2024, 12, 25, 14, 30);
// 3. 日期时间计算
LocalDate nextWeek = today.plusWeeks(1);
LocalDateTime threeHoursLater = currentDateTime.plusHours(3);
// 4. 格式化与解析
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = currentDateTime.format(formatter);
System.out.println("格式化后: " + formattedDateTime);
LocalDateTime parsedDateTime = LocalDateTime.parse("2024-08-01 10:00:00", formatter);
// 5. 计算间隔
LocalDate start = LocalDate.of(2023, 1, 1);
LocalDate end = LocalDate.of(2024, 8, 1);
Period period = Period.between(start, end);
System.out.println("间隔: " + period.getYears() + "年" + period.getMonths() + "月" + period.getDays() + "天");
}
}
四、数学计算类 (java.lang 和 java.math 包)
用于执行数学运算和精确计算。
| 类名 | 主要功能 | 典型应用场景 |
|---|---|---|
Math | 提供基本的数学运算方法,如三角函数、指数、对数、取整、绝对值、随机数等。 | 通用数学计算,如生成随机验证码、四舍五入。 |
StrictMath | 提供与 Math 相同功能,但保证在所有平台上结果完全相同。 | 对计算结果一致性有严格要求的科学计算。 |
BigInteger | 不可变的任意精度整数。 | 超出 long 范围的超大整数计算,如金融、密码学。 |
BigDecimal | 不可变的、任意精度的有符号十进制数。 | 精确的货币计算、税率计算等,严禁使用 double 。 |
代码示例:BigDecimal 精确计算
import java.math.BigDecimal;
import java.math.RoundingMode;
public class MathUtilsDemo {
public static void main(String[] args) {
// 错误的浮点数计算
double d1 = 0.1;
double d2 = 0.2;
System.out.println("Double 计算 (错误): " + (d1 + d2)); // 输出: 0.30000000000000004
// 正确的 BigDecimal 计算
BigDecimal bd1 = new BigDecimal("0.1");
BigDecimal bd2 = new BigDecimal("0.2");
BigDecimal sum = bd1.add(bd2);
System.out.println("BigDecimal 计算 (精确): " + sum); // 输出: 0.3
// 设置精度和舍入模式(金融计算必备)
BigDecimal price = new BigDecimal("19.99");
BigDecimal taxRate = new BigDecimal("0.08"); // 8%税率
BigDecimal tax = price.multiply(taxRate).setScale(2, RoundingMode.HALF_UP);
BigDecimal total = price.add(tax);
System.out.println("商品价格: " + price);
System.out.println("税额: " + tax);
System.out.println("总价: " + total);
}
}
五、并发编程工具类 (java.util.concurrent 包及其子包)
用于构建可靠、高效的多线程程序,是现代高并发后端系统的核心 。
| 类名 | 主要功能 | 典型应用场景 |
|---|---|---|
AtomicInteger / AtomicLong | 提供原子操作的整数和长整数。 | 计数器、序列号生成,无需加锁。 |
ConcurrentHashMap | 线程安全的哈希表,高并发下性能优于 Hashtable 和同步的 HashMap。 | 高并发缓存的实现。 |
CountDownLatch | 允许一个或多个线程等待其他线程完成操作。 | 主线程等待多个服务启动完成。 |
CyclicBarrier | 让一组线程互相等待至某个状态,然后同时执行。 | 多线程分步任务,等待所有线程完成第一阶段再进入第二阶段。 |
Semaphore | 信号量,控制同时访问特定资源的线程数量。 | 数据库连接池限流、限制接口并发调用数。 |
Executors | 创建各种线程池的工厂方法。 | 快速创建 ThreadPoolExecutor、ScheduledThreadPool 等。 |
ThreadLocalRandom (Java 7+) | 为每个线程生成独立的随机数生成器,减少竞争。 | 高并发下生成随机数。 |
代码示例:使用 CountDownLatch
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ConcurrencyDemo {
public static void main(String[] args) throws InterruptedException {
final int taskCount = 5;
CountDownLatch latch = new CountDownLatch(taskCount);
ExecutorService executor = Executors.newFixedThreadPool(3);
for (int i = 0; i < taskCount; i++) {
final int taskId = i;
executor.submit(() -> {
try {
// 模拟任务执行
Thread.sleep((long) (Math.random() * 1000));
System.out.println("任务 " + taskId + " 执行完毕");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch.countDown(); // 任务完成,计数器减1
}
});
}
System.out.println("主线程等待所有任务完成...");
latch.await(); // 主线程阻塞,直到计数器为0
System.out.println("所有任务已完成,主线程继续执行");
executor.shutdown();
}
}
六、其他常用工具类
| 类名 | 所属包 | 主要功能 |
|---|---|---|
Optional<T> | java.util | 容器类,用于避免 null 值,明确表达值可能不存在的意图。 |
Files / Paths | java.nio.file | 提供丰富的文件I/O操作,比传统的 File 类更强大。 |
UUID | java.util | 生成通用唯一标识符。 |
Base64 | java.util | 提供 Base64 编码和解码。 |
Properties | java.util | 处理 .properties 配置文件。 |
Random | java.util | 生成伪随机数。 |
总结:熟练掌握这些 JDK 自带工具类是 Java 后端开发者的基本素养。它们构建了程序的核心逻辑,从数据操作(集合、字符串)、业务计算(日期、数学)到系统构建(并发、I/O)都不可或缺。在实际项目中,通常会结合 Apache Commons Lang、Guava、Hutool 等第三方工具库,但 JDK 工具类是所有这些的基础和起点 。例如,在定义状态时,应优先使用枚举而非魔数 ,而涉及消息队列等中间件交互时,也常需与 java.util.concurrent 中的工具协同工作以保障系统稳定性 。
参考来源
- Java后端开发常用规范
- 后端开发教程系列-java向
- Java8 StreamApi 常用重要功能封装工具类
- Java:企业级java后端开发,需要掌握哪些内容
- JAVA后端开发浅谈
- Java 后端开发常用的技术栈
更多推荐




所有评论(0)