Java拆分function:这是预期的行为吗?

class Test{ public static void main(String[] arg){ String str1="a,,"; String str2="a,,b"; System.out.println(str1+" len="+str1.split(",").length); System.out.println(str2+" len="+str2.split(",").length); } } 

输出是

 a,, len=1 a,,b len=3 

在这两种情况下,部件数量不应该是3吗?

不,你所看到的是完全正常的。 我能说的最好的是ciopy-paste文档:

此方法返回的数组包含此字符串的每个子字符串,该子字符串由与给定表达式匹配的另一个子字符串终止,或者由字符串的结尾终止。 数组中的子串按它们在此字符串中出现的顺序排列。 如果表达式与输入的任何部分都不匹配,那么结果数组只有一个元素,即该字符串。

limit参数控制模式的应用次数,因此会影响结果数组的长度。 如果限制n大于零,那么模式将最多应用n – 1次,数组的长度将不大于n,并且数组的最后一个条目将包含超出最后一个匹配分隔符的所有输入。 如果n是非正数,那么模式将被应用尽可能多的次数,并且数组可以具有任何长度。 如果n为零,那么模式将被应用尽可能多的次数,该数组可以具有任何长度,并且将丢弃尾随的空字符串。

您需要阅读文档以更好地理解=)
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html

这是根据Java API的预期行为。

此方法的作用就像通过调用给定表达式和limit参数为零的双参数split方法一样。 因此,结尾的空字符串不包含在结果数组中。

要获得更多控制,请考虑查看String#split(String, int)方法。

这个例子在oracle文档中,这解决了所有的困惑。

字符串“boo:and:foo”正则表达式“o”

结果{“b”,“”,“:和:f”}

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)

试试这个。

 String str1="a,,"; String str2="a,,b"; System.out.println(str1+" len="+str1.split(",", -1).length); System.out.println(str2+" len="+str2.split(",", -1).length);