一、Scanner 工具类
java.util.Scanner中的工具类
Scanner 类扫描控制台输入,里面集成了一些方法去读取输入的内容,方法如下:
// 创建 Scanner 对象,从标准输入流中读取数据,其中 System.in 返回的是一个字节输入流。
Scanner scanner = new Scanner(System.in);//nextLine() 方法会扫描输入流中的字符,直到遇到行末尾的换行符 \n,然后将该行的内容作为字符串返回,同时,nextLine() 会将 Scanner 对象的位置移动到下一行的开头,以便下一次读取数据时从下一行的开头开始读取
String line = scanner.nextLine();//nextInt() 用于从输入流中读取下一个整数并返回,如果输入流中没有整数,或者不是整数,将抛出 InputMismatchException 异常。
int a = scanner.nextInt();sboolean hasNext():检查输入流是否还有下一个标记。
boolean hasNextLine():检查输入流是否还有下一行。
String next():读取输入流中的下一个标记(使用默认的分隔符,通常是空格或换行符)。
double nextDouble():读取输入流中的下一个双精度浮点数。//scanner 对象的构造方法中还包含着读取file对象,读取后可以使用上面方法对文件中的数据进行检索Scanner scanner = new Scanner(file);//正则表达式中的 \Z 表示输入的结尾,也就是文件结束符。在 Scanner 类中,我们可以使用 \Z 作为分隔符,以便读取整个文件内容。scanner.useDelimiter("\\Z");//当然后续还有4个findxxx方法可以去查找匹配项
二、Arrays 工具类
数组专用的工具类 java.util.Arrays,其提供了静态方法供数组进行操作,如下:
/**** 创建数组:* copyOf,复制指定的数组,截取或用 null 填充* copyOfRange,复制指定范围内的数组到一个新的数组* fill,对数组进行填充*/
String[] intro = new String[] { "沉", "默", "王", "二" };
String[] stutter = new String[4];
String[] revised = Arrays.copyOf(intro, 3); //复制前3个
String[] abridgement = Arrays.copyOfRange(intro, 0, 3); //复制索引 0到3
Arrays.fill(stutter, "沉默王二"); //填充4个内容到数组/*** 比较数组:* equals(str1,str2); 数组类型,长度,内容都进行比较* hashCode(); 比较严谨** 数组排序:* Arrays.sort(sorted);** 数组检索:进行二分查找,可以精确检索,也可以模糊检索,比如说忽略大小写* Arrays.binarySearch(sorted, "wang");** 数组转流* Arrays 类的 stream() 方法可以将数组转换成流,而流的中集成了一些操作集,方便对数据进行各自处理** 打印数组:* Arrays.toString()** 数组转List:* String[] intro = new String[] { "沉", "默", "王", "二" };* List<String> rets = Arrays.asList(intro);* 但是Arrays.asList返回的是 java.util.Arrays.ArrayList,并不是 java.util.ArrayList,它的长度是固定的,无法进行元素的删除或者添加。正确的转化如下:* List<String> rets1 = new ArrayList<>(Arrays.asList(intro)); * * parallelPrefix:用于在数组上进行并行前缀运算,并填充计算结果* setAll:用于初始化数组元素,填充每个元素的值基于其索引。*果/
三、StringUtils 工具类
org.apache.commons.lang3包下的StringUtils工具类
提供了多个封装的静态方法对于string对象进行处理:(详细查看官网文档)
- trim(String str):去除字符串首尾的空白字符。
- trimToEmpty(String str):去除字符串首尾的空白字符,如果字符串为 - null,则返回空字符串。
- trimToNull(String str):去除字符串首尾的空白字符,如果结果为空字- 符串,则返回 null。
- equals(String str1, String str2):比较两个字符串是否相等。
- equalsIgnoreCase(String str1, String str2):比较两个字符串是否- 相等,忽略大小写。
- startsWith(String str, String prefix):检查字符串是否以指定的前- 缀开头。
- endsWith(String str, String suffix):检查字符串是否以指定的后缀- 结尾。
- contains(String str, CharSequence seq):检查字符串是否包含指定的- 字符序列。
- indexOf(String str, CharSequence seq):返回指定字符序列在字符串- 中首次出现的索引,如果没有找到,则返回 -1。
- lastIndexOf(String str, CharSequence seq):返回指定字符序列在字- 符串中最后一次出现的索引,如果没有找到,则返回 -1。
- substring(String str, int start, int end):截取字符串中指定范围 的子串。
- replace(String str, String searchString, String replacement):- 替换字符串中所有出现的搜索字符串为指定的替换字符串。
- replaceAll(String str, String regex, String replacement):使用- 正则表达式替换字符串中所有匹配的部分。
- join(Iterable<?> iterable, String separator):使用指定的分隔符- 将可迭代对象中的元素连接为一个字符串。
- split(String str, String separator):使用指定的分隔符将字符串分- 割为一个字符串数组。
- capitalize(String str):将字符串的第一个字符转换为大写。
- uncapitalize(String str):将字符串的第一个字符转换为小写。
四、Objects工具类

在 Java 中,所有的类都默认继承自 Object 类
-
对象判空
- 下面两者方法根据对象是否为空,返回的是 true 和 false,在开发过程中还需要添加 if 判断进行输出异常信息;
- Objects 的 isNull 方法用于判断对象是否为空;
- nonNull 方法判断对象是否不为空;
-
对象为空时抛出异常
- Objects 的 requireNonNull 方法可以在判断对象为空时,抛出信息;不为空时,正常输出对象值;
- 支持重构抛出的信息
Integer integer1 = new Integer(128);Objects.requireNonNull(integer1); Objects.requireNonNull(integer1, "参数不能为空"); //右边自定义信息 Objects.requireNonNull(integer1, () -> "参数不能为空");/*使用 Supplier<String> 作为错误消息提供者,而不是直接使用 String,主要是为了性能优化,尤其是在 错误消息构建成本较高 的情况下;上边使用自定义消息会在调用requireNonNull()方法时 创建字符串,增加内存资源,而使Supplier的话,只是作为形参的形式传递到,不会执行生成错误信息,只有当对象为空时才会创建,避免无效的创建;*/
-
判断两个对象是否相等
- 数值类型:基本类型使用 “==” 进行比较内容、使用 “equals();" 编译器报错,因为基本数据类型不是对象;
- 包装类使用 equals();进行内容比较、使用 “==” 比较的是引用 (即对象内存地址);
- 字符串类型对象:使用 equals() 方法比较内容,使用 Objects.equals() 安全处理 null、使用 “==” 比较的是引用 (即对象内存地址);
- 自定义对象类型:重写 equals() 方法以实现内容比较,使用 equals() 方法进行比较,如下所示;
@Overridepublic boolean equals(Object obj) {if (this == obj) {return true;}if (obj == null || getClass() != obj.getClass()) {return false;}Person person = (Person) obj;return age == person.age && Objects.equals(name, person.name);}
-
获取对象的 hashCode
-
在 Java 中,hashCode() 方法是 Object 类中定义的一个方法,用于返回对象的哈希码值。哈希码是一个整数,它代表了对象在内存中的一种近似表示
- 如果两个对象的 equals() 方法返回 true,那么它们的 hashCode() 方法必须返回相同的值。这是 Java 规范的要求,否则哈希表将无法正常工作
- 两个对象的 hashCode() 方法返回相同的值,但它们的 equals() 方法可能返回 false。这意味着这两个对象在哈希表中的位置可能相同,但它们的内容并不相等。
-
主要用于支持哈希表,可以使用哈希算法来快速查找、插入和删除元素;
-
工作原理:哈希表通过将对象的哈希码映射到表中的一个位置来存储对象。当需要查找一个对象时,哈希表会先计算出对象的哈希码,然后根据哈希码找到对象在表中的位置,从而快速找到对象。
-
用法:
String str = new String("沉默王二");System.out.println(Objects.hashCode(str)); // 结果867758096
-
-
比较两个对象
- 在 Java 中,Object.compare 方法是一个静态方法,定义在 Java.util.Object 类中。方法签名如下:
public static <T> int compare(T a, T b, Comparator<? super T> c)
- 接受两个比较对象和一个比较器,比较器得重写自定义内部规则。示例如下所示:
Person person1 = new Person("itwanger", 30);Person person2 = new Person("chenqingyang", 25);// 创建一个比较器,用于比较 Person 对象的年龄Comparator<Person> ageComparator = Comparator.comparingInt(Person::getAge);// 使用 Objects.compare 方法比较两个 Person 对象的年龄int ageComparisonResult = Objects.compare(person1, person2, ageComparator);System.out.println("年龄排序: " + ageComparisonResult);
-
比较两个数组
- 比较一维数组和二维数组,调用
Object.deepEquals(数组对象,数组对象)
,如果判断成功返回 true ,失败返回 false;
- 比较一维数组和二维数组,调用
五、Collections工具类
Collections 是 JDK 提供的一个工具类,位于 java.util 包下。相当于集合框架的管家,内部含多种集合封装的静态方法。
除了JDK原生的Collections工具类,其在一些主流的框架里面也是有对应的工具包,如Spring的org.springframework.util包下的 CollectionUtils 工具类和 Apache的org.apache.commons.collections包下的 CollectionUtils 工具类。
以下是部分操作方法(详细去查看官方文档)
/*** 1. 排序操作:* reverse(List list):反转顺序* shuffle(List list):洗牌,将顺序打乱* sort(List list):自然升序* sort(List list, Comparator c):按照自定义的比较器排序* swap(List list, int i, int j):将 i 和 j 位置的元素交换位置* * 2. 查找操作:* binarySearch(List list, Object key):二分查找法,前提是 List 已经排序过了* max(Collection coll):返回最大元素* max(Collection coll, Comparator comp):根据自定义比较器,返回最大元素* min(Collection coll):返回最小元素* min(Collection coll, Comparator comp):根据自定义比较器,返回最小元素* fill(List list, Object obj):使用指定对象填充* frequency(Collection c, Object o):返回指定对象出现的次数* * 3. 同步操作:* HashMap 是线程不安全的,这个我们前面讲到了。那其实 ArrayList 也是线程不安全的,没法在多线程环境下使用,那 Collections 工具类中提供了多个 synchronizedXxx 方法,这些方法会返回一个同步的对象,从而解决多线程中访问集合时的安全问题。* SynchronizedList synchronizedList = Collections.synchronizedList(list);** /
六、Hutool 工具包
官方:https://hutool.cn/
Hutool 是一个开源的工具包,其内部集成了各种各样封装好的库。Hutool 对不仅对 JDK 底层的文件、流、加密解密、转码、正则、线程、XML等做了封装,还提供了以下这些组件:

更多需求查看其官方文档,里面内容包含了各自api使用说明。
七、Guava 工具库
- 开发者:Google
- 功能:
- 提供集合、缓存、并发工具、字符串处理、I/O 操作等多种功能。
- 提供了强大的集合框架,如 ImmutableList、Multimap、BiMap 等。
- 支持缓存机制(Cache 和 LoadingCache),允许高效的数据存储和访问。
- 提供了函数式编程的支持,如 Function、Predicate 等。
- 有助于简化常见的编程任务,减少样板代码。
- 优点
- 功能丰富且经过广泛测试。
- 提供了高效的集合和缓存实现。
- 适合需要高性能和复杂数据结构的应用。
官方文档:https://wizardforcel.gitbooks.io/guava-tutorial/content/1.html
八、其他工具类
- IPUtil:处理与 IP 地址相关的操作。
- CollectionUtils:简化对 Java 集合的常见操作。
- MDC:在日志记录中关联线程上下文信息。
- ClassUtils:处理与类相关的工具方法。
- BeanUtils:用于 Java Bean 属性的复制和操作。
- ReflectionUtils:简化反射操作,动态处理类和对象。