使用 StringUtils.split 的坑( 二 )

可以看到如果分隔符为 null ,是按照空白字符 Character.isWhitespace() 分割字符串的 。分割的算法逻辑为:
a. 用于截取的开始下标置为0 ,逐字符读取字符串 。b. 碰到分割的目标字符,把截取的开始下标到当前字符之前的字符串截取出来 。c. 然后用于截取的开始下标置为下一个字符,等到下一次使用 。d. 继续逐字符读取字符串、
2. 分隔符为单个字符
逻辑同上,只是判断逻辑Character.isWhitespace() 变为了指定字符判断 。
// Optimise 1 character casefinal char sep = separatorChars.charAt(0);while (i < len) {if (str.charAt(i) == sep) { // 直接比较...3. 分隔符为字符串
总计逻辑同上,只是判断逻辑变为包含判断 。
// standard casewhile (i < len) {if (separatorChars.indexOf(str.charAt(i)) >= 0) { // 包含判断if (match || preserveAllTokens) {如何解决?1. 使用 splitByWholeSeparator 方法 。
我们想要的是按整个字符串分割,StringUtils 工具类中已经存在具体的实现了,使用 splitByWholeSeparator 方法 。
String str = "aabbccdd";String[] resultArray = StringUtils.splitByWholeSeparator(str, "bc");for (String s : resultArray) {System.out.println(s);}// 输出aabcdd2. 使用 Google Guava 工具库
关于 Guava 工具库的使用,之前也写过一篇文章,可以参考:Guava - 拯救垃圾代码
String str = "aabbccdd";Iterable<String> iterable = Splitter.on("bc").omitEmptyStrings() // 忽略空值.trimResults() // 过滤结果中的空白.split(str);iterable.forEach(System.out::println);// 输出aabcdd3. JDK String.split 方法
使用 String 中的 split 方法可以实现想要效果 。
String str = "aabbccdd";String[] res = str.split("bc");for (String re : res) {System.out.println(re);}// 输出aabcdd但是 String 的 split 方法也有一些坑,比如下面的输出结果 。
String str = ",a,,b,";String[] splitArr = str.split(",");Arrays.stream(splitArr).forEach(System.out::println);// 输出ab开头的逗号,前出现了空格,末尾的逗号,后却没有空格 。
一如既往,文章中代码存放在 Github.com/niumoo/javaNotes.
<完>
文章持续更新,可以微信搜一搜「 程序猿阿朗」或访问「程序猿阿朗博客 」第一时间阅读 。本文 Github.com/niumoo/JavaNotes 已经收录,有很多知识点和系列文章,欢迎Star 。
【使用 StringUtils.split 的坑】

经验总结扩展阅读