java开发StringUtils.split与String.split空格分割性能区别

Java 11-11 12:03

java开发StringUtils.split与string.split空格分割性能区别

在项目中上线不久后,发现CPU相比较跟之前的提高了不好,想一下最近改动最多的就是用了split来分割字符串来处理数据了。会不会CPU使用升高跟这个有关系呢?然后搜索了下程序员们都说在开发过程中,我们要尽量避免使用split,如果非用不可的时候,改成stringUtils.split。好吧,按前辈们的经验,我们先看看后再来改改吧

一、StringUtils 类的全路径

import org.apache.commons.lang3.StringUtils;

如果你的项目是maven工程,首先在pom.xml中添加commons-lang3包的依赖


<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.4</version>
</dependency>
	 

二、String.split()与StringUtils.split()的区别

String.split()会包含空字符串,而且是包含 头部的和中间的, 不包含有效数字后面所有的空字符串.
StringUtils.split()会过滤所有的空字符串. 当然空格不会被过滤.

StringUtils.split()是把分隔符拆成一个个单独的字符,再用这些字符去把字符串进行分割的。只要匹配到了分隔符中的任意一个字符,就会进行分割。而string.split()是把分隔符作为一个整体来对字符串进行分割。

比如分隔符是;,;,那么在用StringUtils.split()时,只要被分割的字符串里遇到;或,,就会被分割。而在用string.split()时,必须被分割的字符串里遇到;,;时才会被分割。

另外string.split()的分隔符参数其实是正则表达式,而StringUtils.split()的分隔符参数就只是个普通的字符串。此外,StringUtils.split()是null-safe的,已经帮你判空了,这也是公司规范要我们使用Apache工具类的原因。不过由于这里的业务要求,最终还是选择使用string.split()。

三、String.split()与StringUtils.split()的性能

相信前辈们都说过split很慢,甚至编程规范也会约束不让用String的split方法。那么到底他们之间性能如何呢?测试过程就不说了。测试结果是:运行环境win7 jdk1.8,分别耗时2746ms和2312ms,可以看出来是差不多的,在jdk1.6上?分别耗时6375ms和1478ms,4倍多的差距,应该就是split很慢的源泉了。所以随着技术的发展进步,很多以前的说法稍不注意就会过时,如同最早的null放在等号前、加号拼接字符串会变慢,都逐步的不是问题了。两者之前喜欢用什么就用哪个吧

四、String.split()与StringUtils.split() 空格分割

在之前的项目里,把split全部改成了StringUtils.split, 结果测试的时候出现bug了。经过排查后发现,原因使用的StringTest.split(" ")用空格来分割的,在改成StringUtils.split(StringTest,"")分隔时出错了。StringUtils.split分隔空格时,字符串前面有空格并且中间有多个空格的,分割只分割成第一个,比如:" hello world" 分割成数组["hello world"]了。后成改成 StringUtils.splitByWholeSeparator(StringTest, ""); 完成解决了。并且在返回的数组结果中自动去掉了空格数组,这也让我可以直接少一步判断。不过还是不改了,不知道会不会又有其它的坑。

五、StringUtils.split()与StringUtils.splitByWholeSeparator等方法

1、splitByWholeSeparatorPreserveAllTokens 会将字符串按照指定字符串拆分;
2、splitByWholeSeparator 会将字符串按照指定字符串拆分,同时,会去除空字符串;
3、splitByCharacterType 按不同类型,进行分割字符串,如字符串大小写,空格,数字,符号,中文等;
4、splitByCharacterTypeCamelCase 按照字符类型进行分割;
5、splitByWholeSeparator 分割字符串过程中会忽略中间的空项,保留末尾的空项;
6、splitByWholeSeparatorPreserveAllToKens 分割字符串过程中会按照每个分隔符进行分割,不忽略任何空白项;
7、splitPreserveAllToKens 分割字符串过程中会按照每个分隔符进行分割,不忽略任何空白项;

怪不得有程序员说很讨厌这些StringUtils工具类。一些实例看着我头大!

相关链接:StringUtils方法实例

相关推荐