可以看到如果分隔符为 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);}// 输出aabcdd
2. 使用 Google Guava 工具库
关于 Guava 工具库的使用,之前也写过一篇文章,可以参考:Guava - 拯救垃圾代码
String str = "aabbccdd";Iterable<String> iterable = Splitter.on("bc").omitEmptyStrings() // 忽略空值.trimResults() // 过滤结果中的空白.split(str);iterable.forEach(System.out::println);// 输出aabcdd
3. 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 的坑】
经验总结扩展阅读
- 薇姿的精华液适合什么年龄的人使用?
- 书名号使用方法 书名号用法
- 华帝电热水器质量好吗 华帝电热水器使用教程
- 冰箱风冷无霜的优缺点 使用效果好不好
- Java Timer使用介绍
- 液晶电视机选购技巧 教你选购使用与维护电视机
- SpringBoot 常用注解的原理和使用
- 椰浆稀释用热水还是冻水
- 毛巾发黄怎么洗又干净又软
- 衣物洗过缩水怎么办