Java String.split()相邻相同字符处理及文档示例解析咨询
Java String.split() 常见问题解析
1. 如何解释Java中String类的split()方法在处理相邻相同字符时的行为?
简单来说:当split()遇到相邻的分隔符时,会在结果数组中生成空字符串,因为两个分隔符之间没有任何有效字符。
举个直观的例子:用"o"分割字符串"booo",结果会是["b", "", "", ""]。原因是:
- 第一个
o和前面的b之间有有效内容"b" - 连续的
o之间没有内容,所以每个相邻o对应一个空串 - 最后一个
o后面也没有内容,所以末尾也会生成一个空串(除非被limit参数过滤)
2. 解析官方示例中"boo:and:foo"的分割结果
先明确split(regex, limit)的核心规则,limit参数直接决定了分割行为:
- limit > 0:最多执行
limit-1次分割,结果数组长度不超过limit,保留末尾空字符串 - limit = 0:尽可能多分割,自动丢弃所有末尾的空字符串
- limit < 0:尽可能多分割,保留所有空字符串(包括末尾的)
原字符串是"boo:and:foo",我们针对"o"作为分隔符的三个示例逐一解释:
示例1:"o" | 5 | { "b", "", ":and:f", "", "" }
limit=5是正数,意味着最多执行5-1=4次分割:
- 第一个
o:分割出"b",剩余字符串为"o:and:foo" - 第二个
o:分割出空串""(相邻o之间无内容),剩余字符串为":and:foo" - 第三个
o(foo中的第一个o):分割出":and:f",剩余字符串为"o" - 第四个
o:分割出空串"",剩余字符串为""
此时已经完成4次分割,达到上限,剩余的""直接加入数组,最终结果长度为5,符合limit的限制。
示例2:"o" | -2 | { "b", "", ":and:f", "", "" }
limit=-2是负数,会执行全部分割,并且保留所有空字符串:
原字符串中有4个o,所以分割4次,把所有分隔符之间/之后的内容都列出来:
b与第一个o之间:"b"- 第一个
o与第二个o之间:"" - 第二个
o与第三个o之间:":and:f" - 第三个
o与第四个o之间:"" - 第四个
o之后:""
所以最终结果保留了所有空字符串,和全部分割的完整结果一致。
示例3:"o" | 0 | { "b", "", ":and:f" }
limit=0会执行全部分割,但自动丢弃末尾的空字符串:
全部分割的完整结果是["b", "", ":and:f", "", ""],末尾有两个空串,所以会被自动移除,最终得到["b", "", ":and:f"]。
另外补充下:作为分隔符的案例逻辑:
比如: | 5 | { "boo", "and", "foo" },因为原字符串只有2个:,最多只能分割2次,所以即使limit=5(远大于实际分割次数),结果也和limit=-2一致,因为已经分割到无法再分的地步了。
内容的提问来源于stack exchange,提问作者Varuna
相关产品推荐
相关产品推荐

