最近在做一些字符串方面的拆分清洗和比对,趁着有空将java里多种拆分字符串的方法做一下比对,常用的四种拆分方法,第一种是字符串自带的split();其他三种是org.apache.commons.lang.StringUtils提供的方法,分别是:StringUtils.split()、StringUtils.splitByWholeSeparator()、StringUtils.splitPreserveAllTokens()。本次比对未看源码,只比对结果和效率。有兴趣的朋友可以看一下源码,比较简单。
下面是比较方法的代码:
public static void main(String[] args) {
String a = "";
out(a.split(","));
out(StringUtils.split(a, ","));
out(StringUtils.splitByWholeSeparator(a, ","));
out(StringUtils.splitPreserveAllTokens(a, ","));
static void out(String[] strs) {
for (int i = 0; i < strs.length; i++) {
String str = strs[i];
if (str == null) {
System.out.print("NULL");
} else if (str.equals("")) {
System.out.print("空字符");
} else if (str.equals(" ")) {
System.out.print("空格");
} else {
System.out.print(str);
if (i != strs.length - 1) {
System.out.print("-");
System.out.print("|" + strs.length);
System.out.println();
输出一下比较的结果:
字符串 方法 | 空字符 | a | ,a | ,a, | a,b | 空格,a,b | a,b,空格 | a,b, | a,b,, | ,a,b | ,,a,b |
split | 空字符|1 | a|1 | 空字符-a|2 | 空字符-a|2 | a-b|2 | 空格-a-b|3 | a-b-空格|3 | a-b|2 | a-b|2 | 空字符-a-b|3 | 空字符-空字符-a-b|4 |
StringUtils.split | |0 | a|1 | a|1 | a|1 | a-b|2 | 空格-a-b|3 | a-b-空格|3 | a-b|2 | a-b|2 | a-b|2 | a-b|2 |
splitByWholeSeparator | |0 | a|1 | a|1 | a-空字符|2 | a-b|2 | 空格-a-b|3 | a-b-空格|3 | a-b-空字符|3 | a-b-空字符|3 | a-b|2 | a-b|2 |
splitPreserveAllTokens | |0 | a|1 | 空字符-a|2 | 空字符-a-空字符|3 | a-b|2 | 空格-a-b|3 | a-b-空格|3 | a-b-空字符|3 | a-b-空字符-空字符|4 | 空字符-a-b|3 | 空字符-空字符-a-b|4 |
这里的空字符指的是 “” ,空格指的是 “ ” 。大部分拆分的情况都已经在表格里了,如果不全,还请各位在评论里补充;
最后测了一下四种方法的运行效率,代码贴在下面:
public static void main(String[] args) {
String a = "a,b, ";
long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
out(a.split(","));
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
out(StringUtils.split(a, ","));
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
out(StringUtils.splitByWholeSeparator(a, ","));
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
out(StringUtils.splitPreserveAllTokens(a, ","));
System.out.println(System.currentTimeMillis() - start);
static void out(String[] strs) {
for (int i = 0; i < strs.length; i++) {
String str = strs[i];
经多次测试,对于相同字符串,相同运算次数,运行时间由长到短,分别是:
a.split(",")
StringUtils.split(a, ",")
StringUtils.splitByWholeSeparator(a, ",")
StringUtils.splitPreserveAllTokens(a, ",")
a.split(",")要比StringUtils.splitPreserveAllTokens(a, ",")慢2倍左右,有兴趣的朋友可以自己测试一下。
虽然效率上存在优劣,但是这四种方法拆分结果各不相同,要根据自己最终的目的去选择合适的方法。尽量不要用a.split(",")
[code="java"]
public static void TestStr(){
//null 和 ""操作~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//判断是否Null 或者 ""
//System.out.println(StringUtils.isEmpty(null));
//System.out.println(StringUti...
split()方法通过指定分隔符对字符串进行切片,如果参数num有指定值,则分隔num+1个子字符串,默认分隔符为所有空字符,包括空格、换行(\n)、制表符(\t)等
rstrip()方法通过
str.split([sep=None][,count=S.count(sep)])
str.rsplit([sep=None][,count=S.count(sep)])
sep — 可选参数,指定的分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等
count — 可选参数,分割次数,默认为分隔符在字符串中出现的总次数
4.返回值
常见String进行split的方法有:
1. JDK中String对象自带的split方法,public String[] split(String regex)
2. commons-lang包中StringUtils提供的splitPreserveAllTokens方法, public static String[] splitPreserveAllTokens(String str, ...
/*1. 分割字符串 ,可以设定得到数组的长度,但一般情况下不要设定,这样会发生冲突 */
StringUtils.split("y5y,4454,545");//默认是按 ,来分割
StringUtils.split("aaaa#sss", "#");
/*结果是:[aaaa, sss]*/
StringUtils.split("aaa
StringUtil或者StringUtils 的 split函数 的参数为string和切割符,且为多字符的情况下,匹配任何一个字符都会进行分割。
如果需要实现按照字符串的所有字符进行分割使用
StringUtils.splitByWholeSeparator();
StringUtils方法的操作对象是java.lang.String 类型的对象,是 JDK 提供的 String 类型操作方法的补充,并且是 null 安全的(即如果输入参数 String 为 null 则不会抛出 NullPointerException ,而是做了相应处理,例如,如果输入为 null 则返回也是 null 等,具体可以查看源代码)。
除了构造器,StringUtils
org.apache.commons.lang.StringUtils中方法的操作对象是java.lang.String类型的对象,是JDK提供的String类型操作方法的补充,并且是null安全的(即如果输入参数String为null则不会抛出NullPointerException,而是做了相应处理,例如,如果输入为null则返回也是null等,具体可以查看源代码)。
除了构造...
import org.apache.commons.lang3.stringUtils
scala> val s1="1234567890"
s1: String = 1234567890
scala> val s2="abcdefghij"
s2: String = abcdefghij
scala> StringUtils.a
abbreviate abbreviateMiddle appendIfMissing appendIfMissingIgnoreC
0.前言字符串分割是日常开发中常见的需求。实际中,我们也没少被String中的split函数挖坑。在commons-lang3中,有一个StringUtils类,里面有很多对字符串进行操作的方法,其中就有split方法。现在我们就将String里的split与StringUtils.split分别拿出来做一下对比。1.先看代码首先为了了解这些split方法的不同,我们先来看个简单的demo。二话不...
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>...