对String类的split方法的一点点研究

今天在复习正则表达式的时候,遇到了一个小问题,话不多说,先贴上代码

1.jpg

当我在用String类的split()方法对str1进行分割的时候,然后在控制台输出,输出结果如下:

2.jpg

意思就是"123a345b"调用split方法后返回的string数组中有7个元素,并且当中含有五个空元素,a元素之前拆出了3个空元素,而a和b之间被拆出了2个空元素,那么问题来了,为什么会出现这种情况呢?

于是我去研究了一下源代码,代码如下:

3.jpg

当代码执行str1.split("\\d"),会自动调用上述方法,此时limit默认为0,在这个方法中最主要的就是一个条件语句,上面的源代码中红色框选的就是if条件语句的判断条件,该判断语句的作用是:判断调用方法时传入的正则表达式是否符合条件,条件的大概意思是:长度为1的正则表达式(通常为单个字符)或者长度为2的正则表达式(通常为转义正则表达式),我给的例子中的"\\d"就是长度为2的转义正则表达式,总之这里判断为true,注意:此时ch已经变成了regex,也就是代表一个数字的ch。然后执行条件语句中的代码块,代码如下:

4.jpg

由于limit为0,此时limited为true,然后执行下面的循环体,循环体中首先判断循环条件:将str1中每一个符合"\\d”的字符的下标赋值给next,下面是我画的一张完整的循环表:

6.jpg

当循环体执行6次之后,循环体条件将不再满足,于是跳出循环体,此时list集合中含有上面的六个元素,off变为了7,然后会执行下面的第一部分代码,第一部分代码的作用就是将整个字符串剩余的部分拆分为最后一个元素,也就是上述的"b"元素,至此,完美解释了开头的问题。那么下图中的第二部分代码又是什么意思呢?其实如果我们string中继续含有数字的话,会继续拆分一个个空格,那么此时第二部分的代码就会发挥作用,将拆分后string数组中末端的所有空格去除,也就是字符串末尾若连续匹配,则所有拆分出来的空字符串会被忽略的原因。

5.jpg


以上分析含有不当之处,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值