Java 字符串分割很常用,但其实它还有第二个参数,limit,它有什么用呢?
我们来试试就知道了
基础常见用法
切割字符串为字符串数组,一个字符串参数,表示以这个字符串作为切割的判断依据。
比如常见的时间都是:
来分割,我们就可以切割来拿到数字。
比如下面这样
@Test
public void test(){
String[] splits = "5he55llo 5world5".split("5");
for (String split : splits) {
System.out.println(split);
}
}
输出样例如下
he
llo
world
1、切割的字符串不会在结果中出现
2、而且如果两个切割的字符串紧挨着的,那么切割的还是会有一个空的字符串
,不是null,而是长度为0的字符串
3、如果切割字符串在首尾也会增加空的字符串
,比如用0
切割00
,那你得到的数组的length是4,对象依次是空的字符串
、0
、0
、空的字符串
不常见的第二个参数limit
源码,默认调用的其实是第二个参数为0
public String[] split(String regex) {
return split(regex, 0);
}
包含两个参数的源码,发现调用的是Pattern的字符串切割,那么大概的思路应该是先从字符串中找到所有切割字符串的下标位置,然后切割指定位置到指定位置的字符串,最后把这些字符串返回为字符串数组。
public String[] split(String regex, int limit) {
//.....省略
return Pattern.compile(regex).split(this, limit);
}
第二个limit参数的用法
直接试一试,首先默认是0,我们填0和不传一样,length为5
@Test
public void test(){
String[] splits = "5he55llo 5world5".split("5",0);
for (String split : splits) {
System.out.println(split);
}
System.out.println("length--"+splits.length);
}
limit表示限制,是限制我们的字符串数组的长度么?然后我们limit取小于length的,结果length就变成了我们希望的length,打印出的结果也变了,比如3,打印出的字符串依次为空字符串
,he
,5llo 5world5
,可以看到后面的就没有切割了,只切割了前面。
@Test
public void test(){
String[] splits = "5he55llo 5world5".split("5",5);
for (String split : splits) {
System.out.println(split);
}
System.out.println("length--"+splits.length);
}
类似的我们换成比length(5)大的,我们换成8(或者其他比5大的),我们发现结果变成6了,打印的字符串在原本的5个末尾上面多了一个空字符串
@Test
public void test(){
String[] splits = "5he55llo 5world5".split("5",10);
for (String split : splits) {
System.out.println(split);
}
System.out.println("length--"+splits.length);
}
其实正常的切割,应该就是6,只是没有传第二个参数,也就是默认limit传0的时候,会切割所有的满足条件的字符串,但是会舍弃最后的空字符串,无论有多少个
,为了验证,我们在最后再加几个切割的字符串,结果为5验证成功。
String[] splits = "5he55llo 5world555555555".split("5");
for (String split : splits) {
System.out.println(split);
}
System.out.println("length--"+splits.length);
总结
java split 第二个参数limit是限制返回的字符串数组的长度的,如果不指定默认是传0,会切割所有符合条件的,但是会去掉最后是空字符串的。(返回的数组的最后一个不可能为空字符串)
如果指定limit就是指定返回的字符串数组的length
1)如果指定的数小于最多的切割个数,最后的字符串可能没有被切割完全
2)如果指定的数大于最多的切割个数,依然返回最多的切割结果,但是不会去掉最后的空字符串的(返回的数组的最后一个可能为空字符串)