java的字符串分割在字符串类里面有一个很方便的函数叫split。调用十分方便,相信一般的初学者都知道。

String s = "1&2&3";
String[] substrs = s.split("&");

但是这个常用的函数是有不少坑的。

对特殊串的分割处理

比如这样的例子

//--------1---------
String[] substrs = "".split("&"); 
// 这样会substrs 的长度是1, 这个还比较好理解
//--------2---------
String[] substrs = "&".split("&"); 
// 这样会substrs 的长度是0, 这个按照上面的逻辑就不好理解了
//--------3---------
String[] substrs = "&&".split("&"); 
// 这样会substrs 的长度依然是0, 这个按照上面的逻辑就更不好理解了
//--------4---------
String[] substrs = "1&&".split("&"); 
// 这样会substrs 的长度是1, 这个按照上面的逻辑稍微又好理解了一些

出现错误不抛出

上面的问题通过尝试还是可以有所了解的。问题出现在一次我对uri的处理上面,如这样的串: http://www.baidu.com/s?wd=av,ok现在我要分割这个问号了:

String[] substr = "http://www.baidu.com/s?wd=av".split("?");

好了,线程直接就断掉了,tmd这什么回事?会想一下才记起来split是支持正则表达式的,这个?确实会引发问题,但是尼玛的给个异常不行吗?这绝对是坑新人啊。


基于以上问题,我还是建议大家在分割字符串的时候使用StringTokenizer这个类。这个类尽管比较旧,但是能解决上面几个问题。 特殊串处理的结果

//--------1---------
StringTokenizer st = new StringTokenizer("", "&");
int n = st.countTokens(); // 结果是0
//--------2---------
StringTokenizer st = new StringTokenizer("&", "&");
int n = st.countTokens(); // 结果是0
//--------3---------
StringTokenizer st = new StringTokenizer("1&", "&");
int n = st.countTokens(); // 结果是1

这样的结果比起split好处理多了

不支持正则表达式

StringTokenizer不支持正则表达式,但是支持一种很奇怪的方法delim的每一个字符都会视作分割符。当然如果有这样的需求的话,还是用split的正则表达式比较划算。