添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
留胡子的扁豆  ·  sql ...·  2 天前    · 
不拘小节的汉堡包  ·  String.prototype.trim( ...·  23 小时前    · 
要出家的小熊猫  ·  Java ...·  18 小时前    · 
一身肌肉的乌龙茶  ·  Qt ...·  1 年前    · 

最近在做一些字符串方面的拆分清洗和比对,趁着有空将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,ba,b,空格a,b,a,b,,,a,b,,a,b
split空字符|1a|1空字符-a|2空字符-a|2a-b|2空格-a-b|3a-b-空格|3a-b|2a-b|2空字符-a-b|3空字符-空字符-a-b|4
StringUtils.split|0a|1a|1a|1a-b|2空格-a-b|3a-b-空格|3a-b|2a-b|2a-b|2a-b|2
splitByWholeSeparator|0a|1a|1a-空字符|2a-b|2空格-a-b|3a-b-空格|3a-b-空字符|3a-b-空字符|3a-b|2a-b|2
splitPreserveAllTokens|0a|1空字符-a|2空字符-a-空字符|3a-b|2空格-a-b|3a-b-空格|3a-b-空字符|3a-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>...