前几天看到同事代码里有类似如下这样一行代码:
String[] testStrs3 = testStr3.split(",", -1);
因为之前使用split()方法没有加过第二个参数,所以对此进行了学习,在此做个总结与分享。
1.代码示例
先来看一段测试代码:
public class Test {
public static void main(String[] args) {
String testStr = ",aa,bb,cc,";
//情形1: split(String)
String[] testStrs1 = testStr.split(",");
printArray(testStrs1, 1);
//情形2: split(String, int)
String[] testStrs2 = testStr.split(",", 0);
printArray(testStrs2, 2);
//情形3: split(String, int)
String[] testStrs3 = testStr.split(",", -1);
printArray(testStrs3, 3);
//情形4: split(String, int)
String[] testStrs4 = testStr.split(",", 2);
printArray(testStrs4, 4);
}
private static void printArray(String[] testStrs, int index) {
System.out.println("情形[" + index + "]打印开始");
for (String str : testStrs) {
System.out.println(str);
}
System.out.println("情形[" + index + "]打印结束");
System.out.println();
}
}
运行结果:
情形[1]打印开始
aa
bb
cc
情形[1]打印结束
情形[2]打印开始
aa
bb
cc
情形[2]打印结束
情形[3]打印开始
aa
bb
cc
情形[3]打印结束
情形[4]打印开始
aa,bb,cc,
情形[4]打印结束
从打印结果来看,同一个字符串,使用同一个方法split()来分割,但结果差异还是比较大的,下面分析一下split()的第二个int类型参数的作用。
2.方法解析
在String类中,split()方法有两种实现,方法签名如下:
public String[] split(String regex);
public String[] split(String regex, int limit);
从源码中可以看到,其实第一个方法是基于第二个方法实现的,只是limit参数默认为0
public String[] split(String regex) {
return split(regex, 0);
}
所以,上面提出的问题就可以归结到limit参数了。下面是split()方法注释中对limit参数的说明:
可以看到:
- 当limit>0时,字符串最多会被分割limit-1次,即最后得到长度为limit的数组。如果字符串包含多于limit-1个分隔符,那么从第limit-1个分隔符到最后的子字符串将被当成一个字符串放到分割后的字符串数组的最后;
- 当limit<0时,字符串会被分割尽可能多的次数;
- 当limit=0时,字符串也将被分割成尽可能多的次数,不同的是最后的空字符串会被丢弃。
看到上面注解后,也就明白上面代码打印不同结果的原因了。情形1和情形2其实同属于limit为0的情况,所以分割后最后的空字符串被丢弃,但是第一个空字符串会保留;情形3为limit小于0的情况,所以最后的空字符串也不会被丢弃;情形4是limit大于0的情况,所以字符串只被分割了limit-1即2-1=1次,最后得到的字符串数组之后两个元素。
3.提醒
当对于一个空字符串进行分割时,不管limit参数为何,最后结果都是得到一个只包含一个空字符串的(长度为1)的字符串数组,这个有时候需要注意。
4.结语
以上内容如有错误之处,敬请指正,不胜感激。