Spring的StringUtils的isEmpty实现

开发的时候遇到一个问题,有个先用StringUtils.isEmpty判断是否为空,然后不为空则进行subString,结果报indexOutOfBoundsException,数组下标越界。

原因是使用Stringutils.isEmpty判断StringBuilder是否为空时,无法判断StringBuilder是否为空串"",我查看源码分析了一下,下面是Spring的StringUtils中isEmpty方法的源码,注意这里框了两个方法。

然后为什么"".equals(stringBuilder)会返回false

分析:

"".equals,前面是字符串,所以调用的是String的equals方法,这个是重写的equals。查看源码。

Spring的StringUtils的isEmpty实现_第1张图片

后面stringBuilder对象,并不是instanceof String的,所以就直接return false了。

 

然后再看String是如何实现equals的,它做了一点优化,先判断了整体长度是否相同,然后循环比较每个位置的char(值比对),然后如果全部相同则认为是相同,也就是比较了String的值。

 

展开1:

两个StringBuilder值相同,是否可以用equals。

不可以,StringBuilder没有重写equals方法,也就是使用的是继承来的Object的equals方法,Object的equals方法使用的是==,也就是引用地址相同。两个不同的StringBuilder对象,肯定是指向不同的内存地址,所以返回false。

所以比较StringBuilder值是否相同的时候,应该使用toString()转换为String再进行equals比较。

 

展开2:

为什么会出现这个问题,,,以前我们都用apache的common-lang(3)里面的StringUtils,最近Spring也给了自己的工具类,然后想全部使用Spring的jar包,这样就不需要引入apache的jar包了,所以我都尽量使用Spring的工具类。

看下common-lang3的StringUtils中的isEmpty的实现。

Spring的StringUtils的isEmpty实现_第2张图片

 

它的逻辑就没问题,判断CharSequence.length() == 0. CharSequence是一个接口,字面意思,是一堆char组成的序列,StringStringBuilder都是它的实现。

 

Spring的工具类看起来就有点草率,它看起来接收了Object参数,实际上却必须要求传入的是String类型的参数,才可能返回true,这不是脱裤子。。。

 

好了,怎么解决问题

  1. 使用apache的工具类
  2. 转换成String进行判断
  3. 还记得我们框了两个方法吗,第二个hasLength方法,和apache的isEmpty逻辑完全一样,可以用这个。

 

我更倾向于用第2种。

你可能感兴趣的:(Java)