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

String[]str1=";;;".split(";");String[]str2=";a;;".split(";");String[]str3=";;a;".spli... String[] str1 = ";;;".split(";");
String[] str2 = ";a;;".split(";");
String[] str3 = ";;a;".split(";");
System.out.println(str1.length);
System.out.println(str2.length);
System.out.println(str3.length);
展开
 我来答
匿名用户
推荐于2016-04-09
展开全部

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

更多追问追答
追问
java api中String str="boo:and:foo";
str.split("o") 结果b后面有一个空格
{ "b", "", ":and:f" },两个重叠的字符中间有一个空字符,以"boo"类推";;a;" 问题中str3长度应该为2即{"",a},为什么会是3呢?
追答
";;a;" 相当于 "[];[];[a];[]",省去结尾的[],剩下的子串是3个啊
yh1234cc
2014-08-28 · TA获得超过146个赞
知道小有建树答主
回答量:144
采纳率:0%
帮助的人:111万
展开全部
你反编译代码进去看下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
更多追问追答
追问
java api中String str="boo:and:foo";
str.split("o") 结果b后面有一个空格
{ "b", "", ":and:f" },两个重叠的字符中间有一个空字符,以"boo"类推";;a;" 问题中str3长度应该为2即{"",a},为什么会是3呢?
追答
String[] str3 = ";;a;".split(";"); 

第一个双引号到第一个分号为1个字符,

第一个分号到第二个分号为1个字符,
第二个分号到a为1个字符,
a到第三个分号为一个字符(这个最后的空串字符会舍弃)。 总共3个字符。 没问题啊

java api中String str="boo:and:foo";
也是一样 第一个双引号到 第一个o为一个字符,
第一个o到第二个o为一个字符
第二个o到:andf为一个字符
后面的都当空串舍弃了. 不就是{ "b", "", ":and:f" }了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
arrow7880
2014-08-28 · TA获得超过100个赞
知道答主
回答量:140
采纳率:100%
帮助的人:117万
展开全部
因为它的参数其实是正则表达式
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式