根据 "\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 行为的主要内容,如果未能解决你的问题,请参考以下文章