java关于split函数的问题,请问输出结果为什么是0;2;3?

2025-05-18 21:31:30
推荐回答(3个)
回答1:

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();

回答2:

你反编译代码进去看下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

回答3:

因为它的参数其实是正则表达式