Spring的StringUtils的isEmpty实现

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

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

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

分析:

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

后面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的实现。

 

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

 

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

 

好了,怎么解决问题

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

 

我更倾向于用第2种。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值