java拆分字符串的split方法对比

本文对比了Java中字符串拆分的四种方法,包括String类的split()以及Apache Commons Lang的StringUtils.split()、splitByWholeSeparator()、splitPreserveAllTokens()。通过实例代码展示了它们的效果和效率差异,提醒开发者根据实际需求选择合适的方法,避免使用效率较低的a.split(",")。" 105798599,1344900,群体心理探析:《乌合之众:大众心理研究》读书笔记,"['心理学', '社会学', '群体行为', '决策', '社会影响']

   最近在做一些字符串方面的拆分清洗和比对,趁着有空将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(",")

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值