前言
在java的庞大体系中,其实有很多不错的小工具,也就是我们平常说的:轮子
。
如果在我们的日常工作当中,能够将这些轮子用户,再配合一下idea的快捷键,可以极大得提升我们的开发效率。
今天我决定把一些压箱底的小工具,分享给大家,希望对你有所帮助。
本文会分享17个我们日常工作中一定会用得到的小工具,主要内容如下:
1. Collections
首先出场的是java.util
包下的Collections
类,该类主要用于操作集合或者返回集合,我个人非常喜欢用它。
1.1 排序
在工作中经常有对集合排序的需求。
看看使用Collections
工具是如何实现升序和降序的:
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
Collections.sort(list);//升序
System.out.println(list);
Collections.reverse(list);//降序
System.out.println(list);
执行结果:
[1, 2, 3]
[3, 2, 1]
1.2 获取最大或最小值
有时候需要找出集合中的最大值
或者最小值
,这时可以使用Collections的max
和min
方法。例如:
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
Integer max = Collections.max(list);//获取最大值
Integer min = Collections.min(list);//获取最小值
System.out.println(max);
System.out.println(min);
执行结果:
3
1
1.3 转换线程安全集合
我们都知道,java中的很多集合,比如:ArrayList、LinkedList、HashMap、HashSet等,都是线程不安全的。
换句话说,这些集合在多线程的环境中,添加数据会出现异常。
这时,可以用Collections的synchronizedxxx
方法,将这些线程不安全的集合,直接转换成线程安全集合。例如:
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
List<Integer> integers = Collections.synchronizedList(list);//将ArrayList转换成线程安全集合
System.out.println(integers);
它的底层会创建SynchronizedRandomAccessList或者SynchronizedList类,这两个类的很多方法都会用synchronized加锁。
1.4 返回空集合
有时,我们在判空之后,需要返回空集合,就可以使用emptyList方法,例如:
private List<Integer> fun(List<Integer> list) {
if (list == null || list.size() == 0) {
return Collections.emptyList();
}
//业务处理
return list;
}
1.5 二分查找
binarySearch
方法提供了一个非常好用的二分查找
功能,只用传入指定集合和需要找到的key即可。例如:
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
int i = Collections.binarySearch(list, 3);//二分查找
System.out.println(i );
执行结果:
2
1.6 转换成不可修改集合
为了防止后续的程序把某个集合的结果修改了,有时候我们需要把某个集合定义成不可修改的,使用Collections的unmodifiablexxx
方法就能轻松实现:
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
List<Integer> integers = Collections.unmodifiableList(list);
integers.add(4);
System.out.println(integers);
执行结果:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055)
at com.sue.jump.service.test1.UtilTest.main(UtilTest.java:19)
当然Collections工具类中还有很多常用的方法,在这里就不一一介绍了,需要你自己去探索。
2. CollectionUtils
对集合操作,除了前面说的Collections
工具类之后,CollectionUtils
工具类也非常常用。
目前比较主流的是spring
的org.springframework.util
包下的CollectionUtils工具类。
和apache
的org.apache.commons.collections
包下的CollectionUtils工具类。
我个人更推荐使用apache的包下的CollectionUtils工具类,因为它的工具更多更全面。
举个简单的例子,spring的CollectionUtils工具类没有判断集合不为空的方法。而apache的CollectionUtils工具类却有。
下面我们以apache的CollectionUtils工具类为例,介绍一下常用方法。
2.1 集合判空
通过CollectionUtils工具类的isEmpty方法可以轻松判断集合是否为空,isNotEmpty方法判断集合不为空。
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
if (CollectionUtils.isEmpty(list)) {
System.out.println("集合为空");
}
if (CollectionUtils.isNotEmpty(list)) {
System.out.println("集合不为空");
}
2.2 对两个集合进行操作
有时候我们需要对已有的两个集合进行操作,比如取交集或者并集等。
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
List<Integer> list2 = new ArrayList<>();
list2.add(2);
list2.add(4);
//获取并集
Collection<Integer> unionList = CollectionUtils.union(list, list2);
System.out.println(unionList);
//获取交集
Collection<Integer> intersectionList = CollectionUtils.intersection(list, list2);
System.out.println(intersectionList);
//获取交集的补集
Collection<Integer> disjunctionList = CollectionUtils.disjunction(list, list2);
System.out.println(disjunctionList);
//获取差集
Collection<Integer> subtractList = CollectionUtils.subtract(list, list2);
System.out.println(subtractList);
执行结果:
[1, 2, 3, 4]
[2]
[1, 3, 4]
[1, 3]
说句实话,对两个集合的操作,在实际工作中用得挺多的,特别是很多批量的场景中。以前我们需要写一堆代码,但没想到有现成的轮子。
3. Lists
如果你引入com.google.guava的pom文件,会获得很多好用的小工具。这里推荐一款com.go