public static void main(String args[]) {
String sub="0110000";
String a[]=sub.split("");
System.out.println(Arrays.toString(a));
}
我得到输出为
[, 0, 1, 1, 0, 0, 0, 0]
为什么第一个元素为null? 如何在开始时获得一个没有null的数组?
答案 0 :(得分:9)
第一个参数实际上不是null,它是空字符串""
。这是输出的一部分的原因是你拆分空字符串。
分裂的文档说
此方法返回的数组包含此字符串的每个子字符串,该子字符串由与给定表达式匹配的另一个子字符串终止,或者以字符串的结尾终止。
输入字符串中的每个位置都以空字符串(包括位置0)开头,因此split函数也会将位置0处的输入拆分。由于第0位没有字符,因此第一个字符串为空字符串元件。
请改为尝试:
String sub = "0110000";
String a[] = sub.split("(?<=.)");
System.out.println(Arrays.toString(a));
输出:
[0, 1, 1, 0, 0, 0, 0]
模式(?<=.)
是"zero-width positive lookbehind",匹配任意字符(.
)。在文字中,它粗略地说“在每个空字符串上分开,前面有一些字符”。
答案 1 :(得分:5)
这是String#split
的一个怪癖,它所采用的字符串实际上是一个正则表达式,它匹配输入开头的空字符串。
尝试toCharArray()
代替:
public static void main(String args[])
{
String sub="0110000";
char a[]=sub.toCharArray();
System.out.println(Arrays.toString(a));
}
我会将其作为练习让读者将char[]
数组转换为String[]
答案 2 :(得分:2)
它不是null,它是一个空字符串。这是一个重要的区别!
您可以使用此构造获得所需内容:
String[] tokens = "0110000".split("(?<=.)";
// the (?<=.) means that there must be a character
// before the match, hence the initial empty string won't match
System.out.println(Arrays.toString(tokens)));
但我认为这不是一个好主意。我无法想象为什么要将String拆分为单字母字符串数组。您可能应该使用此代码:
char[] chars = "001100".toCharArray();
答案 3 :(得分:1)
因为“”匹配字符串的开头。它最后也会匹配,但split()
会丢弃尾随的空字符串。
答案 4 :(得分:0)
字符串始终以空字符串开头。空字符串不包含任何字符。您可以查看类似的问题here。