之前有使用过split函数,但是对这个函数并没有很深入的了解。昨天遇到一个坑,问题 如下:
<span style="font-family:Microsoft YaHei;font-size:18px;">int i = "s\\\\|s\\".split("\\\\|s").length;
i = ?</span>
看到这里有点蒙,不知从何下手,这才通过编译器得出答案。但是还是不理解,基础不行就是这样,做什么事都很吃力。
接下来就研究一下它的用法。
print函数:
public static void print(String[] str_array){
System.out.println("str_array size:" + str_array.length);
for(String str : str_array){
System.out.println(str + " : " + str.length());
}
}
1、平时简单的用法
String str1 = "1,2,3,4,5";
String[] str_array = str1.split(",");
print(str_array);
这个模式很容易就可以看懂,平时就是这么用的,答案是:
2、稍微有点不同
String str2 = ",1,2,3,4,5,";
String[] str_array = str2.split(",");
print(str_array);
好了,问题来了,第一个个逗号“,”前面不是什么都没有吗,为什么前面会有分割出一个String对象出来?没错,split函数就是这样子的功能,将对应分隔符将字符串进行分割,那么在前面位置被分割为“”和“1,2,3,4,5,”,分割为两部分。即最前面的str_array[0] = "";一个长度为0的字符串。如果是这样,按照我的说法,那么上面有6个逗号,应该最后被分割为7个字符串才对,那为什么答案只有6个?但是,测试了多个字符串,发现字符串数组值只保存了到最后一个length不等于0的下标,后面那些长度为0的“”都被遗弃掉了。这个原理我也不知道为什么。在没有找到真相之前就姑且先这样记着吧。
有一个比较好记忆的方法,就是将每一个分隔符都看成我们的回车键,按下每个回车键就可以得到生成的数组的大小了。
如字符串:,1,2,3,,,4,5,得出的长度为8
3、看一下我们最初的问题
<span style="font-size:18px;">String str3 = "s\\\\|s\\";
str_array = str3.split("\\\\|s");
print(str_array);</span>
发现了一个混淆的问题,就是我们使用split函数时,“|”表示or的意思,但是当想把“|”作为分隔符时,要使用转义字符“\”,那么“\\\\|s”是“\\”or"s"还是“\\\\|s”连成一体呢?找了资料发现,在字符串中如果想要表示单单的字符“\”而不是表示转义字符时,是写成“\\”表示反斜杠“\”。由于“\”不仅是java中的特殊字符,也是正则中的特殊字符,所以要双重转义“\\\\”,所以就得到了原来spllit()中的意思是,分隔符“\”或者"s",这样就明白了许多了。
表示网上的文章质量都很一般,大多雷同,都没有讲到这个问题,找了好久都没有想要的答案,在写到这篇文章的最后,终于在知乎上发现别人解释和我验证的差不多,才验证了自己发现的问题的准确性:
学习的点:
1、字符串和split中转义符的使用
2、分割后的字符串数组中会存在长度为0的字符串
3、返回的数组后面长度为0的字符串都会被抛弃
附上知乎上的连接点击打开链接