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

来源:互联网 发布:阿沁的淘宝店是正品么 编辑:程序博客网 时间:2024/06/04 19:36

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

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


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

原创粉丝点击