String有个方法split是用来拆分字符串的,下面开始讨论着字符串有哪些坑。下面正对Java做几个实验,采用工具jshell
命令 | 输出结果 |
---|---|
jshell> "a,b,c".split(",") |
$1 ==> String[3] { "a", "b", "c" } |
jshell> "a,b,".split(",") |
$2 ==> String[2] { "a", "b" } |
jshell> "a,,c".split(",") |
$3 ==> String[3] { "a", "", "c" } |
jshell> ",b,c".split(",") |
$4 ==> String[3] { "", "b", "c" } |
jshell> ",b,".split(",") |
$5 ==> String[2] { "", "b" } |
",,a,,b,,".split(",") |
$6 ==> String[5] { "", "", "a", "", "b" } |
从上面的实验中,我们先假设逗号之间或者与开头或结尾之间拆分出来的是空字符串,我们会发现一个规律,拆分结果末尾的所有空字符串都被砍掉,而开头的和中间的不会被砍掉。为了证明我们的结论是否正确,我们看看源码是怎么写的。
// Construct result
int resultSize = matchList.size();
if (limit == 0)
while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
resultSize--;
String[] result = new String[resultSize];
return matchList.subList(0, resultSize).toArray(result);
从while子句中可以看出来,原来砍掉后面的空格是特意要这么做的啊,倒着往前删,连续的空串都去掉。不知道为什么要这样做,但这很容易给缺乏经验的人造成坑!那么从JavaScript里看看是不是也这样呢,我们再做做实验。我们采用jrunscript工具
命令 | 输出结果 |
---|---|
nashorn> ",,b,,b,,".split(",") |
[object Array] |
",,b,,c,,".split(",").length |
7 |
nashorn> ",,b,,c,,".split(",").toString() |
,,b,,c,, |
看来js和java还是有很大不同的。js并不会砍掉末尾的空串,而是有多少算多少,都装到数组里。