Java Utils

一、字符串相关

String 类在平常的java开发过程中用的最多的一个类,经常需要围绕String做一些处理,JDK自身也提供了很多String API,但是功能都比较基础。通常需要结合String 多个方法才能完成一个业务功能。
首先介绍的是Apache提供的StringUtils工具类
需要引入的pom依赖:

  1. <dependency>
  2. <groupId>org.apache.commons</groupId>
  3. <artifactId>commons-lang3</artifactId>
  4. <version>3.10</version>
  5. </dependency>

:::info 说明:commons-lang3是一直在维护的新版本,建议使用这个,而不是commons-lang :::

1、判断字符串是否为空

  1. String str = "hello world";
  2. if (null == str || str.isEmpty()) {
  3. }

上面的写法想必大家应该都写过,这段代码虽然简单,但是一不小心很容易造成空指针异常
使用StringUtils写法如下:

  1. if(StringUtils.isEmpty(str)){
  2. }

上面的代码判断为字符串为空是不是更简单呢,不过需要注意的是下面这种情况

  1. public class UtilsTest {
  2. public static void main(String[] args) {
  3. String str1 = "";
  4. String str2 = " ";
  5. System.out.println(StringUtils.isEmpty(str1));
  6. System.out.println(StringUtils.isEmpty(str2));
  7. }
  8. }

2、字符串固定长度

  1. String result = StringUtils.leftPad("test",8,"0");

上面leftPad方法表示返回字符串固定长度8,如果不足,在左边补0

3、关键字替换

  1. StringUtils.replace("abc","a","A");
  2. StringUtils.replaceOnce("aba","a","A");
  3. StringUtils.replacePattern("ABCabc123","[^A-Z0-9]+","");

4、字符串拼接

  1. String[] array = new String[]{"abc","123","456"};
  2. StringBuilder stringBuilder = new StringBuilder();
  3. for(String s:array){
  4. stringBuilder.append(s).append(";");
  5. }
  6. System.out.println(stringBuilder.toString());

StringUtils类使用

  1. String[] array = new String[]{"abc","123","456"};
  2. StringUtils.join(array,";")

5、字符串拆分

  1. StringUtils.split("a..b.c",",")

二、日期相关

DateUtils和DateFormatUtils
在JDK8之前,Java只提供了一个Date类,当需要将Date按照一定格式转换成字符串的时候,这个时候需要使用到SimpleDateFormat类。

1、日期转指定格式的字符串

  1. public class UtilsTest {
  2. public static void main(String[] args) {
  3. Date date = new Date();
  4. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  5. String dateString=simpleDateFormat.format(date);
  6. System.out.println(dateString);
  7. }
  8. }

看起来好像也很简单,但是这里面用到的SimpleDateFormat不是线程安全的,这就导致在多线程环境下可能出现线程安全的问题,因此,可以使用common-lang3下的时间工具类DataUtils/DateFormateUtils,从而解决Date与字符串的转换问题。
方法很简单,上面代码的转换等价于如下代码:

  1. String dateString = DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss");
  2. System.out.println(dateString);

2、字符串转日期

  1. Date date = DateUtils.parseDate("2020-10-15 22:00:00","yyyy-MM-dd HH:mm:ss");System.out.println(date);

输出结果:

  1. Thu Oct 15 22:00:00 CST 2020

3、DateUtils时间计算

除开上面的日期转换之外,DateUtils还提供了很方便的时间计算的功能函数
直接贴代码:

  1. public class UtilsTest {
  2. public static void main(String[] args){
  3. Date now = new Date();
  4. //Date加1天
  5. Date addDays = DateUtils.addDays(now, 1);
  6. //Date加33分钟
  7. Date addMinutes = DateUtils.addMinutes(now, 33);
  8. //Date减去60秒
  9. Date addSeconds = DateUtils.addSeconds(now, -60);
  10. //过滤时分秒
  11. Date date = Dateutils.truncate(now, Calendar.DATE);
  12. System.out.println(date);
  13. System.out.println(addDays);
  14. System.out.println(addMinutes);
  15. System.out.println(addSeconds);
  16. }
  17. }

输出结果:

  1. Thu 0ct 15 00:00:00 CST 2020
  2. Fri 0ct 16 22:50:46 CST 2020
  3. Thu 0ct 15 23:23:46 CST 2020
  4. Thu 0ct 15 22:49:46 CST 2020

三、集合数组相关

1、判断是否为空

以前这样判断

  1. List<String> list = new ArrayList<String>();
  2. if(null==list||list.isEmpty()){
  3. }

上面写起来其实也不难,但是也比较容易抛出空指针异常,现在可以通过使用commons-collections类来判断是否为空
pom依赖:

  1. <dependency>
  2. <groupId>org.apache.commons</groupId>
  3. <artifactId>commons-collections4</artifactId>
  4. <version>4.4</version>
  5. </dependency>

使用CollectionUtils/MapUtils/ArrayUtils进行判空判断

  1. List<String> list = new ArrayList<String>();
  2. Map map = new HashMap();
  3. String[] strings = new String[];
  4. map.put("name", "zxb");
  5. if (CollectionUtils.isEmpty(list)) {
  6. }
  7. if (MapUtils.isEmpty(map)){
  8. }
  9. if(ArrayUtils.isEmpty(strings)){
  10. }

:::tips 其中要注意的是ArrayUtils是commons-lang3包下的 :::

2、将数组快速加入到list中

直接上代码:

  1. public class UtilsTest {
  2. public static void main(String[] args){
  3. List<String> list = new ArrayList<String>();
  4. list.add("A");
  5. list.add("B");
  6. list.add("C");
  7. String[] arrays = new String[]{ "D", "E", "H"};
  8. CollectionUtils.addAll(list, arrays);
  9. System.out.print1n(list);
  10. }
  11. }

输出:

  1. [A, B, CD, E, H]

其他的方法这里不做过多补充,Google的Guava工具类也有很多对于集合的操作增强类

四、计时相关

以前计时:

  1. long start = System.currentTimeMillis();
  2. long end = System.currentTimeMillis();
  3. System.out.println("运行时间:"+(end-start)+"ms");

上面想必大家都用过,确实很简单,但是这种计时是非常不灵活的,默认情况下只能取ms为单位,如果需要分钟呢?那就需要另外计算来转换,这里给大家介绍Guava stopwatch计时工具类来统计程序执行时间
pom依赖:

  1. <dependency>
  2. <groupId>com.google.guava</groupId>
  3. <artifactId>guava</artifactId>
  4. <version>19.0</version>
  5. </dependency>

使用Stopwatch工具类统计程序执行时间:

  1. public class UtilsTest{
  2. public static void main(String[] args) throws InterruptedException {
  3. Stopwatch stopwatch = Stopwatch.createStarted();
  4. //创建计时器,但是不是立即执行,需要主动调用start方法开始计时
  5. //Stopwatch stopwatch = Stopwatch.createUnstacted();
  6. //stopwatch.start();
  7. //这里当做其他代码花费时间
  8. TimeUnit.SECONDS.sleep( timeout: 2l);
  9. //当前消耗的时间
  10. System.out.println(stopwatch.elapsed(TimeUnit.SECONDS));
  11. TimeUnit.SECONDS.sleep( timeout: 2l);
  12. stopwatch.stop();
  13. System.out.println(stopwatch.elapsed(TimeUnit.SECONDS));
  14. //重新开始,从原来时间基础上计算,如果想要重新从0开始计算,需要调用stopwatch.reset()
  15. stopwatch.start();
  16. TimeUnit.SECONDS.sleep( timeout: 2l);
  17. system.out.println(stopwatch.elapsed(TimeUnit.SECONDS));
  18. }
  19. }

输出结果:

  1. 2
  2. 4
  3. 6