jdk1.6_API 中有2个split()函数。
第1个是split(String regex,int limit),limit与模式被限制使用的次数有关(若limit == n and n > 0,则模式最多被应用n-1次, 之后若该字符串未匹配完,则返回剩余字符串)。
当limit的值为0时,模式可以使用尽可能多的次数(字符串可以完全匹配),但返回结果中结尾的空子串被丢弃了。
楼主调用的是第2个split(String regex)函数,而该函数是调用split(String regex, 0)来实现的,现在limit == 0,就会舍弃后面的空串。
若要详细了解,请参考java API。
public class T{
public static void main(String[] args){
String[] str1 = ";;;".split(";");
String[] str11 = ";;;".split(";", -1);
String[] str2 = ";a;;".split(";");
String[] str22 = ";a;;".split(";", -1);
String[] str3 = ";;a;".split(";");
String[] str33 = ";;a;".split(";", -1);
String[] str4 = ";;a;;".split(";");
String[] str44 = ";;a;;".split(";", -1);
String[] str5 = ";;a;;;".split(";");
String[] str55 = ";;a;;;".split(";", -1);
System.out.println("<1>\n"+str1.length);
prtStrArr(str1);
System.out.println(str11.length);
prtStrArr(str11);
System.out.println("<2>\n"+str2.length);
prtStrArr(str2);
System.out.println(str22.length);
prtStrArr(str22);
System.out.println("<3>\n"+str3.length);
prtStrArr(str3);
System.out.println(str33.length);
prtStrArr(str33);
System.out.println("<4>\n"+str4.length);
prtStrArr(str4);
System.out.println(str44.length);
prtStrArr(str44);
System.out.println("<5>\n"+str5.length);
prtStrArr(str5);
System.out.println(str55.length);
prtStrArr(str55);
}
private static void prtStrArr(String[] s){
for(int i=0;i < s.length;i++)
System.out.print("["+s[i]+"]");
System.out.println();
}
}
limit == -1 代表,不丢弃结尾空串
上述代码,可以更好理解split();
你反编译代码进去看下split的实现.
底层实现调用的都是这个方法.
public String[] split(String regex) {
return split(regex, 0);
}
简单来描述这个0的概念就是把结尾的空字符串丢弃.所以你第一个数组输出为0,而第二个数组输出为2.
如果你这么写String[] str1 = ";;;".split(";",-1); 那输出数组长度就为4.
这里参数-1的概念就是不丢弃字符串.
这里有篇博文介绍的挺详细 ,有很多列子,你可以参考一下
http://yinny.iteye.com/blog/1750210
因为它的参数其实是正则表达式