针对于相应的String类下的split()方法的分析
@Test
public void test12(){
//自定义一个字符串
String str = new String("52,5222sdf+jkl,03355s,,jkl, ,");
//注意这里字符串最后是"",是分析的关键
//同样还是这个数组
//
//第一种 limit>0
System.out.println("1111111111");
// limit > 0 ,则返回的字符串长度为 2 * (limit - 1),最后一个字符串,将包含最后一次分隔符所分割的后续所有的字符串。
String[] newStr = str.split(",",2);
for(int i = 0;i < newStr.length;i++){
System.out.println(newStr[i]);
if (newStr[i].equals("")) {
System.out.println("null");
}
}
//第二种 limit=0 ,返回字符串数组的长度不限制,但是最后一个尾随的空字符串会被抛弃 值得注意的是" "不算空字符串,匹配得到的
// 最后一个空字符串""将被舍弃
System.out.println("22222222222");
String[] newStr1 = str.split(",",0); //
for(int i = 0;i < newStr1.length;i++){
System.out.println(newStr1[i]);
if (newStr1[i].equals("")) {
System.out.println("null");
}
}
//第三种 limit<0 返回字符串数组的长度不限制,所有均会返回,包括最后一个""
System.out.println("333333333");
String[] newStr2 = str.split(",",-1);
for(int i = 0;i < newStr2.length;i++){
System.out.println(newStr2[i]);
if (newStr2[i].equals("")) {
System.out.println("null");
}
}
}
考虑如上代码,其运行结果如下:
从上述运行结果结合下述源码注释可以得知:String 的split()方法的参数主要分为: 第一个参数为待检测的分隔符,第二个为limit限制参数。第一个参数很好理解,笔者就不在此赘述了。第二个参数limit需要根据各种情况来判断:
第一种情况
limit>0 :则返回的字符串长度为 2 * (limit - 1),其中返回的的数组的最后一个字符串,将包含最后一次分隔符所分割的后续所有的字符串。对应如下代码
String[] newStr = str.split(",",2);
for(int i = 0;i < newStr.length;i++){
System.out.println(newStr[i]);
if (newStr[i].equals("")) {
System.out.println("null");
}
}
相应返回的字符串数组newStr,包含的字符串长度是2(limit - 1) = 2(2-1) = 2个,最后一个字符串将包含第一次匹配后的后半部分,即第一个",“后的所有内容,即为"5222sdf+jkl,03355s,jkl, ,” 相应运行结果如下:**
与分析结果相匹配。
第二种情况
limit=0 :则返回的字符串长度为 任意长度,即匹配的所有长度,返回所有匹配完的结果,但值得注意的是,此时最后一个空字符串数组"",将被舍弃。
对应处理代码如下所示:
//第二种 limit=0 ,返回字符串数组的长度不限制,但是最后一个尾随的空字符串会被抛弃 值得注意的是" "不算空字符串,匹配得到的
// 最后一个空字符串""将被舍弃
System.out.println("22222222222");
String[] newStr1 = str.split(",",0); //
for(int i = 0;i < newStr1.length;i++){
System.out.println(newStr1[i]);
if (newStr1[i].equals("")) {
System.out.println("null");
}
}
此时返回结果应该是匹配的所有结果,不断拆分,直到拆不下去了。但最后一个空字符串将不被返回对应的输出结果为,为便于分析将相应的空字符串"",后面添加一个null:
“52”
“5222sdf+jkl”
“03355s”
null
“jkl”
" "
对应的输出结果为:
对比运行结果我们发现,相应的中间多了一个空行,这是为啥呢?
仔细分析如下代码:
String[] newStr1 = str.split(",",0); //
for(int i = 0;i < newStr1.length;i++){
System.out.println(newStr1[i]);
if (newStr1[i].equals("")) {
System.out.println("null");
}
}
可以看出首先我们是println()分割后的字符,那么如果输出字符串为空字符串时,将会输出一个空行,这也是空行的由来。验证一下:运行如下代码:
@Test
public void test13(){
System.out.println("*******");
System.out.println("");
System.out.println("********");
}
输出为:
可知猜想正确,我们的分析也是正确的。
第三种情况
limit<0 返回字符串数组的长度不限制,所有匹配的内容均会返回,包括最后一个""
针对这个理解,我们输出的内容应该是
“52”
“5222sdf+jkl”
“03355s”
null
“jkl”
" "
null
相应输出结果为:
与我们相应的分析理解一致。也符合源代码注释的理解。