首页 > 代码库 > Java中String的split()方法的一些需要注意的地方

Java中String的split()方法的一些需要注意的地方

项目中我用到了字符串的split()方法,为这种方法的方便称赞,可是程序在测试的时候出现的问题折腾了我好久,原来在使用的时候存在着以下几个需要注意的地方。
本来使用split()方法是判断String的数量,结果这么的不靠谱,最后换成了hashset动态添加字符串,然后求hashset.size()的方法得到字符串的个数解决的。。。。
 
 
Java代码  收藏代码
  1. public String[] split(String regex, int limit)  

 split函数是用于使用特定的切割符(regex)来分隔字符串成一个字符串数组,这里我就不讨论第二个参数(可选)的含义详见官方API说明

 

我在做项目期间曾经遇到一个“bug”,就是当split函数处理空字符串时,返回数组的数组竟然有值。。。查完API才发现就是这么规定的。

官方API 写道
If the expression does not match any part of the input then the resulting array has just one element, namely this string.

 原来我不能小看空字符串,它也是字符串的一种,当split函数没有发现匹配的分隔符时,返回数组就只包含一个元素(该字符串本身)。以为这样就结束了,幸亏我做了几个试验,忽然又发现了一些问题,代码如下:

Java代码  收藏代码
  1. public class Split {  
  2.   
  3.     public static void main(String[] args) {  
  4.         String str1 = "a-b";          
  5.         String str2 = "a-b-";  
  6.         String str3 = "-a-b";  
  7.         String str4 = "-a-b-";  
  8.         String str5 = "a";  
  9.         String str6 = "-";  
  10.         String str7 = "--";  
  11.         String str8 = "";   //等同于new String()  
  12.           
  13.         getSplitLen(str1);  
  14.         getSplitLen(str2);  
  15.         getSplitLen(str3);  
  16.         getSplitLen(str4);  
  17.         getSplitLen(str5);  
  18.         getSplitLen(str6);  
  19.         getSplitLen(str7);  
  20.         getSplitLen(str8);  
  21.     }  
  22.       
  23.     public static void getSplitLen(String demo){  
  24.         String[] array = demo.split("-");  
  25.         int len = array.length;  
  26.         System.out.print("\"" + demo + "\"长度为:" + len);  
  27.         if(len >= 0){  
  28.             for(int i=0; i<len; i++){  
  29.                 System.out.print(" \""+array[i]+"\"");  
  30.             }             
  31.         }  
  32.         System.out.println();  
  33.     }  
  34.   
  35. }  

 运行结果:

"a-b"长度为:2 "a" "b"
"a-b-"长度为:2 "a" "b"
"-a-b"长度为:3 "" "a" "b"
"-a-b-"长度为:3 "" "a" "b"
"a"长度为:1 "a"
"-"长度为:0
"--"长度为:0
""长度为:1 ""

 

和我想的还是不大一样,因为不知道源码也不知道具体是怎么实现的,我的理解如下:

  1. 当字符串只包含分隔符,返回数组没有元素;
  2. 当字符串不包含分隔符时,返回数组只包含一个元素(该字符串本身);
  3. 字符串最尾部出现的分隔符可以看成不存在,不影响字符串的分隔;
  4. 字符串最前端出现的分隔符将分隔出一个空字符串以及剩下的部分的正常分隔;