必备字符串操作
我们将字符串操作分为下面6种:
- 基本操作方法
- 字符串判空、比较
- 字符串截取和拆分
- 字符串查找和替换
- 字符串和其他类型数据的转换
- 字符串拼接和格式化
今天我们来讲解第3.2节。
字符串拆分原生方法
对于字符串拆分的原生操作
1 | java复制代码//字符串拆分原生方法: |
问题: 对字符串中含有“|”分割符部分进行拆分,怎么写?
直接str.split("|")
可以吗?当然可以,但是结果是不是你想要的呢?
1 | java复制代码String str = "a.|b."; |
答案: 如果只是单纯想按照“|”分割,正确的写法是ss.split("\\|")
,因为这里碰到烦人的正则表达式。
1 | java复制代码String str = "a.|b."; // 使用“|”拆分 |
split源码分析
1 | java复制代码// 选取源码中关键的分析 |
源码不复杂,核心内容是:
(1)不是正则表达式的元字符".$|()[{^?*+\"
或``开头但后面不是[0-9a-zA-Z]
的使用快速拆分模式
(2)其他情况使用正则表达式匹配模式拆分
这里涉及到另外一个知识点,正则表达式,如果对正则表达式感兴趣的可以参考其他博文。
当然我认为你是没有兴趣的,而且很多程序员也很讨厌正则表达的规则,需要用的时候再翻阅。
对于(1),如果你十分精通正则表达式,可以很快知道哪些是正则元字符,你可以尝试使用原生的方法,毕竟使用方便且拆分速度确实快。
对于(2),因为正则表达式需要编译再匹配,比较耗时,所以不建议使用正则表达式。至于为什么正则表达式会慢,你就想你只见过一个姑娘一面就想找到她,和你知道她的名字地址具体信息比,哪个找到她更快?
综上所述,原生方法存在以下问题:
- 使用前要判空
- 小心正则表达式里面特殊字符
- 性能不佳
为什么不推荐StringTokenizer
当然有同学可能会说jdk还有一个用于拆分字符串的类:StringTokenizer
,它不是基于正则表达式进行拆分,性能应该高。但是笔者并不推荐使用此方法进行字符串拆分。我们先看源码:
1 | java复制代码/** |
只看关键单词discouraged
=不推荐。知道它是一个为了兼容而遗留下的类,官方不推荐使用就足够的。
另外一个不推荐的原因是:本来很简单的一个拆分,使用它需要搭配while
循环,索性就不要用它了。
推荐字符串拆分操作
善用StringUtils.splitXX()
推荐使用Apache工具类StringUtils.splitXX()
优势: 不用担心字符串为null(空),方法名直白。
推荐常用方法:
1 | java复制代码// 按照指定分割符拆分字符串 |
对于上面问题按照“|”拆分,可以一行代码搞定。
1 | java复制代码String str = "a.|b."; |
开发中比较常见的需求是对", . | * : "
等进行拆分。如果你对正则元字符不熟悉,很容易写出错误的拆分。
所以还是建议直接使用StringUtils工具类进行拆分,减少写代码时的思考成本。
StringUtils.split也有坑
img
还是上述例子,如果对字符串"a.|b.c"
按照".|"
进行拆分,使用StringUtils.split可以吗?
1 | java复制代码// 问题:请使用“.|”拆分 |
答案是不行,拆分的结果是[a, b, c]
,并不是期望的[a, b.c]
, 这是因为StringUtils.split方法是将多字符分割符拆成单个分割符进行拆分,再将非分割符部分返回。
如果希望对多字符分割符拆分,请使用StringUtils.splitByWholeSeparator()
方法。
这个小细节,希望大家能够避坑。
demo用例
1 | java复制代码import org.apache.commons.lang3.StringUtils; |
总结
- 直接使用
StringUtils
最省事(注意上面写的避坑)。 - 如果是对非特殊字符拆分,比如对字母数字拆分,可以使用原生的split方法。
- 不要使用StringTokenizer。
感谢阅读本期内容,希望对新入行的你有帮助。
如果你意犹未尽,后面有一个字符串拆分姊妹篇,欢迎继续查看。
往期内容:
- 我决定写一本Java实用技术,特点实用!实用!还是实用!
- 【Java实用技术】必备字符串操作之判空
- 【Java实用技术】java中关于整数的几个冷知识,总有一个你不知道
- 【Java实用技术】字符串的截取用什么方法好?
我是Pandas,专注Java编程实用技术分享,公众号
Java实用技术手册
和B站均有视频解说,欢迎来玩。如果你觉得这篇文章有用,别忘了点赞+关注,一起进步!
本文转载自: 掘金