Java 后端开发中,JDK 自带的工具类提供了基础且强大的功能,是日常编码的基石。这些工具类覆盖了集合操作、字符串处理、日期时间处理、数学计算、并发控制等多个核心领域,正确使用它们可以极大提升开发效率和代码质量 。

下面以表格形式分类列举最常用和重要的 JDK 自带工具类,并附上关键代码示例。

一、集合框架工具类 (java.util 包)

这是使用最频繁的工具类集合,用于操作和处理 CollectionMap

类名主要功能典型应用场景
Collections提供操作 Collection 的静态方法,如排序、查找、同步包装、不可变集合等。集合排序、创建线程安全视图、返回空集合以避免NPE。
Arrays提供操作数组的静态方法,如排序、搜索、比较、填充、转换为列表等。数组处理、数组与列表的转换。
Objects提供对象操作的工具方法,如空值安全的比较、哈希计算、判空等。安全地比较两个对象、生成 hashCode、防止空指针异常。

代码示例:CollectionsArrays 的使用

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) 彻底解决了旧 DateCalendar 的缺陷,是当前开发标准。

类名主要功能典型应用场景
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.langjava.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创建各种线程池的工厂方法。快速创建 ThreadPoolExecutorScheduledThreadPool 等。
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 / Pathsjava.nio.file提供丰富的文件I/O操作,比传统的 File 类更强大。
UUIDjava.util生成通用唯一标识符。
Base64java.util提供 Base64 编码和解码。
Propertiesjava.util处理 .properties 配置文件。
Randomjava.util生成伪随机数。

总结:熟练掌握这些 JDK 自带工具类是 Java 后端开发者的基本素养。它们构建了程序的核心逻辑,从数据操作(集合、字符串)、业务计算(日期、数学)到系统构建(并发、I/O)都不可或缺。在实际项目中,通常会结合 Apache Commons Lang、Guava、Hutool 等第三方工具库,但 JDK 工具类是所有这些的基础和起点 。例如,在定义状态时,应优先使用枚举而非魔数 ,而涉及消息队列等中间件交互时,也常需与 java.util.concurrent 中的工具协同工作以保障系统稳定性 。


参考来源

 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐