根据 "\s+" 拆分空字符串时的 String#split 行为

Posted

技术标签:

【中文标题】根据 "\\s+" 拆分空字符串时的 String#split 行为【英文标题】:String#split behavior when splitting the empty string according the "\s+"根据 "\s+" 拆分空字符串时的 String#split 行为 【发布时间】:2015-12-28 00:29:06 【问题描述】:

我是 Java 新手。不幸的是,在 Java 中,有很多东西对于新手来说非常难以理解。

例如,

String str = "";
String[] arr = str.split("\\s+");
System.out.println(Arrays.toString(arr));
System.out.println(arr.length);
System.exit(0);

输出是

[]
1

但是为什么呢?如果有人能解释一下为什么数组的长度是 1,我将不胜感激。

【问题讨论】:

[] 是 Java 打印列表 [""] 的令人困惑的方式(" 不打印) 请注意,这与 Java 8 无关。 你必须学会​​区分literally nothing(大多数情况下是null值)或空值(您在此处找到的内容为空字符串"",或在其他情况下为空列表、集合、数组),其中包含周围类型但不包含任何内容。 我会不幸地改成幸运地 :) 否则,它就不会有趣了 【参考方案1】:

我们来看看Arrays.toString的实现:

public static String toString(Object[] a) 
    if (a == null)
        return "null";
    int iMax = a.length - 1;
    if (iMax == -1)
        return "[]";

    StringBuilder b = new StringBuilder();
    b.append('[');
    for (int i = 0; ; i++) 
        b.append(String.valueOf(a[i]));  // Let's print that!
        if (i == iMax)
            return b.append(']').toString();
        b.append(", ");
    

现在由于数组不为空,我们将进入for 循环。 我们首先将[ 附加到结果中。然后我们附加String.valueOf(a[i])。让我们尝试打印它:

String str = "";
String[] arr = str.split("\\s+");
System.out.println(String.valueOf(arr[0]));

你会看到输出是......什么都没有!所以最终的结果是:

[]

请注意,这与 Java 8 无关。split 方法是在 much earlier 引入的。

【讨论】:

【参考方案2】:

即使 String 实例为空,它仍然是一个 String 实例,并且“无”必须放在 split() 之后的某个位置。这是数组中的一个元素。

如果你打印str[0],你会得到一个空字符串。真正的“无”是null,但你会得到NullPointerException(你不能在空值上调用split()

【讨论】:

【参考方案3】:

Empty String 存在于拆分数组的 Ist 位置。

public static void main(String[] args) 
        String str = "";
        String[] arr = str.split("\\s+");
        System.out.println(Arrays.toString(arr));
        System.out.println(arr[0]);
        System.out.println(arr.length);
        System.exit(0);
    

输出

[]

1

【讨论】:

以上是关于根据 "\s+" 拆分空字符串时的 String#split 行为的主要内容,如果未能解决你的问题,请参考以下文章

139-WordBreak-单词拆分

LeetCode——139. 单词拆分

139. 单词拆分. dp

LeetCode-动态规划单词拆分

LeetCode 139. 单词拆分 | Python

回文子串解法大全