当我有一个像\n\n\n
这样的字符串,并且我按\\n
分割时,我得到0
。为什么是这样?
public class Test {
public static void main(String []args){
String str = "\n\n\n";
String[] lines = str.split("\\n");
System.out.println(lines.length);
}
}
你可以复制&将代码粘贴到CompileOnline。
答案 0 :(得分:5)
您拆分的令牌不是结果的一部分。由于没有其他内容,因此没有项目可以放入数组中。
但是,当您向基本字符串添加另一个字符时,这会有所不同。当你这样做时,它将包括空条目。
这可以通过查看java.lang.String:2305
中的源代码来解释。
请考虑以下摘录:
// Construct result
int resultSize = list.size();
if (limit == 0)
while (resultSize > 0 && list.get(resultSize - 1).length() == 0)
resultSize--;
String[] result = new String[resultSize];
return list.subList(0, resultSize).toArray(result);
如果你的情况有3个空条目,resultSize
将倒数到0并基本上返回一个空数组。
如果你有3个空条目和一个填充的条目(你添加到结尾的随机字符),resultSize
将不会从4移动,因此你将得到4个项目的数组,其中前3个是空。
基本上它会删除所有尾随的空值。
String str = "\n\n\n"; // Returns length 0
String str = "\n\n\nb"; // Returns length 4
String str = "\n\n\nb\n\n"; // Returns length 4
答案 1 :(得分:4)
如String
javadoc中所述:
此方法的工作方式就像调用带有给定表达式和limit参数为零的双参数split方法一样。 结尾的空字符串因此不包含在结果数组中。
因此,当split()
String
完全由分隔符(无论分隔符是什么)构成时,您将只获得空String
个,分隔符未包含在结果中,因此,它们都将被视为尾随空字符串,并且不包括在结果数组中。
如果你想获得所有东西,包括空字符串,你有两个选择:
在String
的末尾添加不是分隔符的内容:
String str = "\n\n\ne";
String[] lines = str.split("\\n");
System.out.println(lines.length); // prints "4"
使用two-argument split method使用否定limit
:
String str = "\n\n\n";
String[] lines = str.split("\\n", -1);
System.out.println(lines.length); // prints "4"
答案 2 :(得分:0)
因为你的字符串只包含\ n
str.split(“”\ n“)获取\ n之后的字符串,它在下一次拆分搜索之前等于NULL。因此,当[[]行存储NULL时,你得到0。