「工具」JDK好用的工具类或方法
JDK中内置了很多常用的工具类,且多以“s”结尾,如:集合工具类Collections,数组工具类Arrays,对象工具类Objects,文件工具类Files,路径工具类Paths,数学工具类Maths;但也有一些不是以“s”结尾的工具类,如TimeUnit和System。
Objects
Objects中定义很多有用的API,如空指针判断,对象相等比较等。比较常用的API有以下几个:
- 用于判断两个对象是否相等,两个参数都可以为null:public static boolean equals(Object a, Object b)
- 用于判断一个对象是否为空:public static boolean isNull(Object obj)
- 用于判断一个对象是否不为空:public static boolean nonNull(Object obj)
- 用于对变量进行非空校验,如果为空则抛出空指针异常,不为空则返回此变量,还可以抛出指定异常信息
- public static <T> T requireNonNull(T obj)
- public static <T> T requireNonNull(T obj, String message)
//用于判断两个对象是否相等,两个参数都可以为null
String str1 = null;
String str2 = "Hello Java";
System.out.println(Objects.equals(str1, str2));
//用于判断一个对象是否为空
System.out.println(Objects.isNull(str1));
//用于判断一个对象是否不为空
System.out.println(Objects.nonNull(str2));
//用于对变量进行非空校验,如果为空则抛出空指针异常,不为空则返回此变量,还可以抛出指定异常信息
System.out.println(Objects.requireNonNull(str1));
System.out.println(Objects.requireNonNull(str1, "str1 is null"));
java.util.Arrays
Arrays中定义了很多与数组相关API,常用的主要有以下几个API:
- 数组排序:public static void sort(int[] a)
- 二分法查找数组:public static int binarySearch(long[] a, long key)
- 判断两个数组是否相等(数组元素对应相等,且数组长度一致):public static boolean equals(long[] a, long[] a2)
- 使用指定值填充数组:public static void fill(long[] a, long val)
- 复制数组:public static <T> T[] copyOf(T[] original, int newLength)
- 获得数组hashcode:public static int hashCode(long a[])
- 将整个数组转化为形如:[a, b, c, ..., d]的格式的字符串:public static String toString(int[] a)
int[] arr1 = {5, 3, 2, 1, 4};
int[] arr2 = {5, 3, 2, 1, 4, 5};
// 对arr1进行排序,默认是升序排序
Arrays.sort(arr1);
// 搜索2在arr1中的位置,返回索引值,arr1必须是有序的
int index = Arrays.binarySearch(arr1, 2);
// 判断arr1与arr2是否相等
boolean equalFlag = Arrays.equals(arr1, arr2);
int[] newArr = new int[10];
// 使用10填充newArr数组
Arrays.fill(newArr, 10);
// 复制newArr的数组0--4的元素,并返回新数组
int[] ansArr = Arrays.copyOf(newArr, 5);
// 获得ansArr的hashCode
int ansHashCode = Arrays.hashCode(ansArr);
// 将ansArr转化为一个字符串
String str = Arrays.toString(ansArr);
Collections
Collections中定义了许多集合常用的API,常用的API如下:
- 对List进行排序:public static <T extends Comparable<? super T>> void sort(List<T> list)
- 二分法查找List中的元素索引值,List必须有序:public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)
- 翻转List:public static void reverse(List<?> list)
- 寻找出List中的最小元素值:public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)
- 寻找出List中的最大元素值:public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
List<Integer> nums = new ArrayList<>();
nums.add(1);
nums.add(3);
nums.add(2);
nums.add(5);
nums.add(4);
// 对List中的元素进行排序
Collections.sort(nums);
// 寻找5在nums中的索引值
int index = Collections.binarySearch(nums, 5);
// 翻转nums
Collections.reverse(nums);
// 寻找出nums中的最小值
Collections.min(nums);
// 寻找出nums中的最大值
Collections.max(nums);
Files
Files中定义了许多常用的与文件相关的API,常用API如下:
- 获取指定文件的字节输入流:public static InputStream newInputStream(Path path, OpenOption... options)
- 获取指定文件的字节输出流:public static OutputStream newOutputStream(Path path, OpenOption... options)
- 以指定编码获取指定文件的字符输入流:public static BufferedReader newBufferedReader(Path path, Charset cs)
- 以指定编码获取指定文件的字符输出流:public static BufferedWriter newBufferedWriter(Path path, Charset cs, OpenOption... options)
- 以指定编码获取一个文件中的所有内容,并以字符串流返回:public static Stream<String> lines(Path path, Charset cs)
- 创建文件:public static Path createFile(Path path, FileAttribute<?>... attrs)
- 创建路径 :public static Path createDirectory(Path dir, FileAttribute<?>... attrs)
- 删除文件:public static void delete(Path path)
- 如果文件存在,则删除文件:public static boolean deleteIfExists(Path path
- 文件复制:public static Path copy(Path source, Path target, CopyOption... options)
- 文件移动:public static Path move(Path source, Path target, CopyOption... options)
Path dataPath = Paths.get("data.txt");
// 获取字符输入流
InputStream is = Files.newInputStream(dataPath);
// 获取字符输出流
OutputStream os = Files.newOutputStream(dataPath);
// 获取字符输入流
BufferedReader reader = Files.newBufferedReader(dataPath);
// 获取字符输出流
BufferedWriter writer = Files.newBufferedWriter(dataPath);
// 获取文件中的所有内容,并以字符串流返回,每个字符串代表文件的一行文本
Stream<String> lines = Files.lines(dataPath, Charset.forName("UTF-8"));
// 创建一个文件路径
Files.createDirectories(Paths.get("hello"));
// 创建一个文件
Files.createFile(Paths.get("config.txt"));
// 删除文件或文件夹,如果不存在,则会抛出异常
Files.delete(Paths.get("data.txt"));
// 删除文件或文件夹,如果不存在则不会执行删除操作,也不会抛出异常
Files.deleteIfExists(Paths.get("hello"));
// 只能进行文件复制,不能进行文件夹复制
Files.copy(Paths.get("1.txt"), Paths.get("2.txt"));
// 文件或文件夹移动
Files.move(Paths.get("SRC"), Paths.get("DES"));
Maths
Maths主要封装了一些常用的与数学相关的操作。
- Math.ceil() 返回大于等于数字参数的最小整数(取整函数),对数字进行上舍入
- Math.floor() 返回小于等于数字参数的最大整数,对数字进行下舍入
- Math.round() 返回数字最接近的整数,四舍五入
- Math.max() 计算最大值
- Math.min() 计算最小值
- Math.abs() 求绝对值
TimeUnit
TimeUnit 表示给定单元粒度的时间段。TimeUnit是java.util.concurrent下面的一个枚举类,它提供在给定单元中进行跨单元转换和执行计时及延迟操作的实用工具方法。
1、时间转换
年 月 日 时 分 秒 毫秒等时间之间的转化方法
注意: 因为返回的数据类型是long,所以更小单位时间转化为更大单位时间会丢失精度
TimeUnit.SECONDS.toMillis(1) 1秒转换为毫秒数
TimeUnit.SECONDS.toMinutes(60) 60秒转换为分钟数
TimeUnit.SECONDS.sleep(5) 线程休眠5秒
TimeUnit.SECONDS.convert(1, TimeUnit.MINUTES) 1分钟转换为秒数
//TimeUnit.DAYS 日的工具类
//TimeUnit.HOURS 时的工具类
//TimeUnit.MINUTES 分的工具类
//TimeUnit.SECONDS 秒的工具类
//TimeUnit.MILLISECONDS 毫秒的工具类
2、时间长度
TimeUnit.SECONDS
3、线程休眠
替代Thread.sleep(时间段)
//休眠2秒
TimeUnit.SECONDS.sleep(2);
4、对指定线程进行休眠
//休眠当前线程2s
TimeUnit.SECONDS.timeJoin(Thread.currentThread(), 2);
5、指定时间的线程等待
System
System类中的都是静态方法(static关键字修饰),类名访问即可。在JDK中,有许多这样的类。在 System 类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。
// 获取系统当前毫秒值,获取当前系统时间与1970年01月01日00:00点之前的毫秒差值
System.currentTimeMillis();
// 结束正在运行的Java程序,参数传入一个数字即可。通常传入0记为正常状态,其它为异常状态。
System.exit(0);
// 用来运行JVM中的垃圾回收器,完成内存中垃圾的清除
System.gc();
// 确定当前的系统属性
System.getProperties();
// System类方法复制数组
// 参数依次为:要复制的原数组、数组源的起始索引、复制后的目标数组、目标数组起始索引、指定复制的长度
int[] src = {1,22,333,4444,5555,666666,7777777};
int[] dest = {10,20,30};
System.arraycopy(src, 2, dest, 0, 2);
String的静态方法
1、String.format(String format, Object… args)
新字符串使用本地语言环境,指定字符串格式和参数生成格式化的新字符串。
//测试
public static void main(String[] args) {
String str=null;
str=String.format("Hi,%s", "王力");
System.out.println(str);
str=String.format("Hi,%s:%s.%s", "王南","王力","王张");
System.out.println(str);
System.out.printf("字母a的大写是:%c %n", 'A');
System.out.printf("3>7的结果是:%b %n", 3>7);
System.out.printf("100的一半是:%d %n", 100/2);
System.out.printf("100的16进制数是:%x %n", 100);
System.out.printf("100的8进制数是:%o %n", 100);
System.out.printf("50元的书打8.5折扣是:%f 元%n", 50*0.85);
System.out.printf("上面价格的16进制数是:%a %n", 50*0.85);
System.out.printf("上面价格的指数表示:%e %n", 50*0.85);
System.out.printf("上面价格的指数和浮点数结果的长度较短的是:%g %n", 50*0.85);
System.out.printf("上面的折扣是%d%% %n", 85);
System.out.printf("字母A的散列码是:%h %n", 'A');
}
//结果
Hi,王力
Hi,王南:王力.王张
字母a的大写是:A
3>7的结果是:false
100的一半是:50
100的16进制数是:64
100的8进制数是:144
50元的书打8.5折扣是:42.500000 元
上面价格的16进制数是:0x1.54p5
上面价格的指数表示:4.250000e+01
上面价格的指数和浮点数结果的长度较短的是:42.5000
上面的折扣是85%
字母A的散列码是:41
2、String.join()
String.join()方法是JDK1.8之后新增的一个静态方法。
有两个参数:
- 第一个参数:连接符号。
- 第二个参数:表示被连接的数组(也可以是集合),或者是要连接的多个字符串。
// 连接数组
String[] arr = new String[]{"1", "2", "3"};
System.out.println(String.join(",", arr));
// 连接集合
List<String> list = new ArrayList();
list.add("test");
list.add("comm");
list.add("group");
System.out.println(String.join("-", list));
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!