package example;
import org.junit.Test;
public class ExampleTest {
@Test
public void testSplit() {
printStrings("".split(""));
printStrings("~".split("~"));
printStrings("~~".split("~"));
printStrings("".split("~"));
printStrings("~123".split("~"));
private void printStrings(String[] strings) {
System.out.print(strings.length + " [");
for (String str : strings) {
System.out.printf("\"%s\", ", str);
System.out.println("]");
结果与 Scala 是一致的,同时也解释了为什么我们会遇到 ArrayIndexOutOfBoundsException
的问题。
翻阅了 Java 的 API 文档,发现原来 Java 中的 split
方法确实跟其它语言是不一样的,这一点我们特别容易忽略
如果分隔符表达式与字符串不匹配,则返回原始字符串作为数组的唯一值,这也就解释了
"".split("")
"".split("~")
如果分隔符表单式与字符串的开始字符就已经匹配了,则返回值中第一个元素会被设置为 ""
"~123".split("~")
如果 limit
参数为 0,也就是 split(String regex)
方法,则匹配结果末尾的所有空字符串 ""
都会被丢弃,也就解释了下面两段代码
"~".split("~")
"~~".split("~")
然后我又翻阅了 Scala 的官方文档,Scala 和 Java 的行为是一致的。
在 Java 中使用字符串的 split
方法,一般情况下的行为是和其他编程语言是一致的,但在一些边界条件下,也有一些不一致的地方,这一点是我们应该注意的,这也提醒了我们,不要想当然的认为不同语言,同名函数(方法)的功能是完全一致的,当我们遇到一些奇奇怪怪的问题时,多看官方文档才是硬道理。