Java作为一门成熟的编程语言,提供了丰富的工具类库,这些工具类能够帮助开发者高效完成各种常见任务,避免重复造轮子。本文将详细介绍Java中最常用的工具类,并通过大量示例展示它们的实际应用。
一、工具类概述
工具类(Utility Class)是指包含一组静态方法,用于执行特定功能的类。它们通常具有以下特点:
不能被实例化(构造器私有)
所有方法都是静态的
专注于解决某一类特定问题
使用工具类的好处包括:
提高代码复用性
减少重复代码
使代码更加简洁清晰
提高开发效率
二、java.util包核心工具类
1. Collections工具类
Collections
类提供了对集合进行操作的各种静态方法,是处理List、Set等集合的利器。
示例1:集合排序
List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9);
Collections.sort(numbers); // 默认升序排序
System.out.println(numbers); // 输出:[1, 1, 3, 4, 5, 9]
// 自定义排序
Collections.sort(numbers, Collections.reverseOrder());
System.out.println(numbers); // 输出:[9, 5, 4, 3, 1, 1]
示例2:创建不可变集合
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
// 创建线程安全的集合
List<String> syncList = Collections.synchronizedList(list);
// 创建不可修改的集合
List<String> unmodifiableList = Collections.unmodifiableList(list);
// unmodifiableList.add("C++"); // 抛出UnsupportedOperationException
2. Arrays工具类
Arrays
类提供了操作数组的各种方法,包括排序、搜索、比较等。
示例3:数组操作
int[] array = {3, 1, 4, 1, 5, 9};
// 数组排序
Arrays.sort(array);
System.out.println(Arrays.toString(array)); // [1, 1, 3, 4, 5, 9]
// 二分查找(数组必须先排序)
int index = Arrays.binarySearch(array, 4);
System.out.println("4的位置:" + index); // 3
// 数组填充
Arrays.fill(array, 10);
System.out.println(Arrays.toString(array)); // [10, 10, 10, 10, 10, 10]
示例4:数组转集合
String[] languages = {"Java", "Python", "C++"};
// 数组转List
List<String> list = Arrays.asList(languages);
System.out.println(list); // [Java, Python, C++]
// 注意:此List是固定大小的,不能添加/删除元素
// list.add("JavaScript"); // 抛出UnsupportedOperationException
3. Objects工具类
Objects
类提供了对象操作的工具方法,可以避免空指针异常。
示例5:安全对象操作
String str = null;
// 安全的equals比较
System.out.println(Objects.equals(str, "Java")); // false
// 计算哈希码(不会NPE)
System.out.println(Objects.hashCode(str)); // 0
// 非空检查
try {
Objects.requireNonNull(str, "参数不能为null");
} catch (NullPointerException e) {
System.out.println(e.getMessage()); // 参数不能为null
}
三、字符串处理工具
1. StringUtils (Apache Commons Lang)
StringUtils提供了比JDK String类更丰富的字符串操作方法。
示例6:字符串判空处理
import org.apache.commons.lang3.StringUtils;
System.out.println(StringUtils.isEmpty(null)); // true
System.out.println(StringUtils.isEmpty("")); // true
System.out.println(StringUtils.isEmpty(" ")); // false
System.out.println(StringUtils.isBlank(" ")); // true
// 默认值处理
String str = null;
System.out.println(StringUtils.defaultIfBlank(str, "默认值")); // 默认值
示例7:字符串截取与连接
// 安全截取
System.out.println(StringUtils.substring("HelloWorld", 5, 10)); // World
// 字符串连接
System.out.println(StringUtils.join(new String[]{"A", "B", "C"}, ",")); // A,B,C
// 重复字符串
System.out.println(StringUtils.repeat("Java", 3)); // JavaJavaJava
四、日期时间处理工具
1. java.time包 (Java 8+)
Java 8引入了全新的日期时间API,位于java.time包中。
示例8:日期时间操作
import java.time.*;
import java.time.format.*;
// 当前日期
LocalDate today = LocalDate.now();
System.out.println("今天: " + today); // 2023-05-15
// 日期加减
LocalDate nextWeek = today.plusWeeks(1);
System.out.println("下周: " + nextWeek);
// 日期比较
System.out.println("今天是否在明天之前: " + today.isBefore(today.plusDays(1)));
// 日期格式化
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
System.out.println("格式化日期: " + today.format(formatter));
// 解析日期字符串
LocalDate parsedDate = LocalDate.parse("2023/12/31", formatter);
System.out.println("解析后的日期: " + parsedDate);
2. DateUtils (Apache Commons Lang)
示例9:日期操作
import org.apache.commons.lang3.time.DateUtils;
Date date = new Date();
// 日期加减
Date tomorrow = DateUtils.addDays(date, 1);
Date nextMonth = DateUtils.addMonths(date, 1);
// 日期比较
boolean sameDay = DateUtils.isSameDay(date, new Date());
System.out.println("是否是同一天: " + sameDay);
// 日期截断(去掉时分秒)
Date truncated = DateUtils.truncate(date, Calendar.DATE);
五、文件/IO操作工具
1. FileUtils (Apache Commons IO)
示例10:文件操作
import org.apache.commons.io.FileUtils;
// 读取文件内容
String content = FileUtils.readFileToString(new File("test.txt"), "UTF-8");
// 写入文件
FileUtils.writeStringToFile(new File("output.txt"), "Hello World", "UTF-8");
// 复制文件
FileUtils.copyFile(new File("source.txt"), new File("dest.txt"));
// 递归删除目录
FileUtils.deleteDirectory(new File("tempDir"));
2. IOUtils (Apache Commons IO)
示例11:IO流操作
import org.apache.commons.io.IOUtils;
// 读取输入流为字符串
InputStream input = new FileInputStream("test.txt");
String content = IOUtils.toString(input, "UTF-8");
// 复制流
InputStream in = new FileInputStream("source.txt");
OutputStream out = new FileOutputStream("dest.txt");
IOUtils.copy(in, out);
// 安静关闭流(不抛出异常)
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
六、数学运算工具
1. Math类
示例12:数学运算
// 绝对值
System.out.println(Math.abs(-10)); // 10
// 最大值/最小值
System.out.println(Math.max(10, 20)); // 20
System.out.println(Math.min(10, 20)); // 10
// 幂运算
System.out.println(Math.pow(2, 3)); // 8.0
// 四舍五入
System.out.println(Math.round(3.6)); // 4
// 随机数
System.out.println(Math.random()); // 0.0到1.0之间的随机数
2. NumberUtils (Apache Commons Lang)
示例13:数字处理
import org.apache.commons.lang3.math.NumberUtils;
// 检查是否为数字
System.out.println(NumberUtils.isDigits("123")); // true
System.out.println(NumberUtils.isDigits("12a3")); // false
// 安全转换
System.out.println(NumberUtils.toInt("123")); // 123
System.out.println(NumberUtils.toInt("abc", 0)); // 0(默认值)
// 比较数字
System.out.println(NumberUtils.compare(10, 20)); // -1
七、其他实用工具
1. Random类
示例14:生成随机数
Random random = new Random();
// 随机整数
System.out.println(random.nextInt()); // 随机整数
System.out.println(random.nextInt(100)); // 0-99的随机整数
// 随机布尔值
System.out.println(random.nextBoolean());
// 随机浮点数
System.out.println(random.nextDouble());
2. UUID类
示例15:生成唯一ID
UUID uuid = UUID.randomUUID();
System.out.println("随机UUID: " + uuid.toString()); // 如:f47ac10b-58cc-4372-a567-0e02b2c3d479
3. Optional类 (Java 8+)
示例16:避免NullPointerException
Optional<String> optional = Optional.ofNullable(getString());
// 传统方式
if(optional.isPresent()) {
System.out.println(optional.get());
}
// 函数式风格
optional.ifPresent(System.out::println);
// 默认值
String value = optional.orElse("默认值");
// 抛出异常
String result = optional.orElseThrow(() -> new RuntimeException("值不存在"));
总结
Java的工具类库极大地提高了开发效率,本文介绍了:
集合和数组工具:Collections和Arrays类提供了强大的集合和数组操作方法
字符串处理:StringUtils扩展了String的功能
日期时间处理:java.time包和DateUtils简化了日期操作
文件IO操作:FileUtils和IOUtils让文件处理更简单
数学运算:Math和NumberUtils提供了丰富的数学方法
其他工具:Random、UUID、Optional等解决了特定场景问题
在实际开发中,合理使用这些工具类可以:
减少代码量
提高代码可读性
降低出错概率
提升开发效率
建议开发者熟悉这些工具类的API,根据项目需求选择合适的工具类,必要时可以结合使用JDK内置类和第三方工具库(如Apache Commons)。