string 从后往前截取_分享最近在String.split方法上遇到的一个小坑

最近在使用String类中的spilt方法对字符串进行分割的时候,在运行到下面取数组里面的元素的时候会出现StringIndexOutOfBoundsException

对此,请大家先看下面的代码

String str = "/1/2/3/4///";String[] strs = str.split("/");System.out.println("strs数组长度:" + strs.length);System.out.println("strs数组元素:" + Arrays.toString(strs));

对于这段代码,结果是:

strs数组长度:5strs数组元素:[, 1, 2, 3, 4]

为什么,有一个空字符串存在数组中呢,按照道理来说末尾的空字符串都默认去掉了,对此,只能找到jdk源码才能解决我的疑问了。

调用spilt,默认调用了String内部的另一个重载方法,然后我猜想问题出在limit参数上面。

b02cfe555511f0d4fe31e24ed6527dfc.png

接着往下面,调用的重载方法有两个不同的条件,分别走不同的方法。

4c30565fcb1ce50a60378f56261c9a3b.png

当传进来的regex满足下面两个条件之一就不当做正则表达式处理

(1)、字符串长度等于1,.$|()[{^?*+,并且字符串不是这里面中其中一个,也就是不是正则表达式的保留字符,使用这些字符串都要进行转义。

(2)、字符串长度等于2,第一个字符必须时反斜杠,并且第二个字符不是数字或字母

由于篇幅和时间有限,本文暂且只对目前的条件进行分析。

显然当前代码满足这个条件,继续进入if条件。

fad4af487835e3fbb7f561111a6c3e68.png

这个limit其实就是在限制分割的次数。

(1)、当limit == 0 时, limited 为false,!limited为true,默认不限制,取所有能分割的。代码走到2372就真相了,原来当limit == 0 时,默认从后往前去除为空的字符串。if (limit == 0) { while (resultSize > 0 && list.get(resultSize - 1).length() == 0) { resultSize--; }}(2)、当limit == -1时,也是不做分割次数的限制,但是也不会去除list末尾的空字符串。所以上面代码修改后再次执行就是8了修改代码后:String[] strs1 = str.split("/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值