爪哇(Java)自定义的二个字符串高效处理方法,在静寂一个半月之后

本文介绍了两种优化Java字符串处理性能的方法:一种是删除字符串中特定字符,另一种是按特定字符分割字符串。这些方法避免了使用正则表达式,而是采用简单高效的逻辑来实现,显著提高了性能。同时,文章提供了代码实现,方便读者参考和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是测试程序运行结果:

source = a b c d e f g h i j k l m n o p q r s t u v w x y z
字符串中删除字符的方法。
系统函数计算 300000 次用时 1984 ms
自定义方法计算 300000 次用时 344 ms
生成 abcdefghijklmnopqrstuvwxyz 。
---------- ---------- ---------- ----------

字符串按字符分割的方法。
系统函数计算 300000 次用时 1609 ms
自定义方法计算 300000 次用时 281 ms
生成 [Ljava.lang.String;@1010058: [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z] 。
---------- ---------- ---------- ----------

能够数倍超越爪哇(Java)类库(Java5.0和Java6.0)中相关方法的性能,究其原因,是因为类库为通用性,提供的相关方法,都采取了正则表达式参数。虽然编译过的正则表达式很高效,但毕竟无法和字符相等这种单拍操作相提并论。

下面把程序发出来,供大家指出错误、讨论以及参考。

首先是删除字符串中某字符的方法。

/**
 * <b>字符串删除其中某字符</b><br/>
 * 本方法用来移除指定字符串中的指定字符。
 * 在 Java 6.0 以内,删除字符串中的指定字符,需要通过
 * {@link String#replace(CharSequence, CharSequence) replace} 方法,将指定单
 * 字符的字符串,替换成空字符串来实现。而 <code>replace</code> 方法为了追求通用,
 * 使用了正则表达式参数。即便是编译过的正则表达式,其性能也无法与简单的字符相等
 * 判断相提并论。<br/>
 * 本方法不涉及正则表达式,通过 {@link StringBuilder} 来删除原字符串中的目标
 * 字符。是一个简单但高效的方法。<br/>
 * 本方法使用示例如下:
 * <pre>
 * String source = "a b c d e f g h i j k l m n o p q r s t u v w x y z";
 * String removed = StringTool.removeChar(source, ' ');</pre>
 * 此示例中,{@link String} source 为原字符串。String removed 为删除空格后的
 * 结果。
 * @see		String#replace(CharSequence, CharSequence)
 * @see		StringBuilder#deleteCharAt(int)
 * @param 	source	待被处理的字符串,即本方法的“原字符串”
 * @param 	target	需要从原字符串中移除的字符
 * @return		从指定原字符串中移除指定字符后所得的结果字符串
 * @exception	NullPointerException	当传入参数 source 为空时
 */
static public String removeChar(String source, char target)
{
	StringBuilder builder = new StringBuilder(source);
	char[] srcChars = source.toCharArray();
	int accumulation = 0;
	for (int index = -1; ++index != srcChars.length; )
		if (srcChars[index] == target)
			builder.deleteCharAt(index - accumulation++);
	return builder.toString();
}


接下来,是字符串分割的方法。

/**
 * <b>简易字符串分割</b><br/>
 * 本方法用来根据指定字符,将某字符串以此为分割,拆分成多个子字符串。
 * 对于分割字符串功能,在 Java 6.0 以内,都只提供了支持正则表达式的
 * {@link String#split(String) split} 方法。此方法为追求通用,即便是简单的
 * 分割,也会基于正则表达式来进行。即便是编译过的正则表达式,其性能也无法与简单
 * 的字符相等判断相提并论。<br/>
 * 本方法不涉及正则表达式,通过遍历原字符串对应的字符数组来寻找符合分割字符的
 * 字符,然后通过 {@link String#substring(int, int)} 来获取每一个分割字符之间
 * 的子字符串,存入一个 {@link LinkedList} 中。这是一个功能简单但高效的方法。
 * 如果规模比较大,拟考虑先通过一次循环,取得原字符串中分割字符的数量,以此制作
 * 定长的 {@link ArrayList} 。
 * 本方法尤其适用于常见的由半角逗号结合在一起的字符串的分割。<br/>
 * 在编写之初,本方法曾采取将字符串的字符数组分段处理,通过系统字符串复制来形成
 * 一个个子字符串。后经考证,{@link String#substring(int, int)} 是一个很高效的
 * 方法,遂改。效率提高了一倍。
 * 本方法使用示例如下:
 * <pre>
 * String source = "a b c d e f g h i j k l m n o p q r s t u v w x y z";
 * List<String> secs = StringTool.splitSimpleString(source, ' ');</pre>
 * 此示例中,{@link String} source 为原字符串。{@link List} secs 为删除空格后
 * 的结果。
 * @see		String#split(String)
 * @see		String#substring(int, int)
 * @param 	source	待被处理的字符串,即本方法的“原字符串”
 * @param 	gap		分割字符
 * @return		从指定原字符按分割字符拆分成的子字符串列表
 * @exception	NullPointerException	当传入参数 source 为空时
 */
static public List<String> splitSimpleString(String source, char gap)
{
	List<String> result = new LinkedList<String>();
	char[] sourceChars = source.toCharArray();
	String section = null;
	int startIndex = 0;
	for (int index = -1; ++index != sourceChars.length; )
	{
		if (sourceChars[index] != gap) continue;
		section = source.substring(startIndex, index);
		result.add(section);
		startIndex = index + 1;
	}
	section = source.substring(startIndex, sourceChars.length);
	result.add(section);
	return result;
}


最后是测试程序。

static public void main(String[] arguments)
{
	// 准备测试内容
	String source = "a b c d e f g h i j k l m n o p q r s t u v w x y z";
	System.out.println("source = " + source);
	int loop = 300000;
	String resultString = null;
	List<String> resultList = null;
	String[] resultArr = null;
	int index = -1;

	long start = Calendar.getInstance().getTimeInMillis();
	System.out.println("字符串中删除字符的方法。");

	// 测试 Java 类库提供的字符串删除某字符
	index = -1;
	while (++index != loop)
		resultString = source.replace(" ", "");
	long end1 = Calendar.getInstance().getTimeInMillis();
	System.out.println("系统函数计算 " + loop + " 次用时 " + (end1 - start) + "ms");

	// 测试自定义的字符串删除某字符
	index = -1;
	while (++index != loop)
		resultString = StringTool.removeChar(source, ' ');
	long end2 = Calendar.getInstance().getTimeInMillis();
	System.out.println("自定义方法计算 " + loop + " 次用时 " + (end2 - end1) + "ms");

	System.out.println("生成 " + resultString + " 。");
	System.out.println("---------- ---------- ---------- ----------\n");

	// 测试 Java 类库提供的字符串按某字符分割
	System.out.println("字符串按字符分割的方法。");
	index = -1;
	while (++index != loop) resultArr = source.split(" ");
	long end3 = Calendar.getInstance().getTimeInMillis();
	System.out.println("系统函数计算 " + loop + " 次用时 " + (end3 - end2) + "ms");

	// 测试自定义的字符串按某字符分割
	index = -1;
	while (++index != loop)
		resultList = StringTool.splitSimpleString(source, ' ');
	long end4 = Calendar.getInstance().getTimeInMillis();
	System.out.println("自定义方法计算 " + loop + " 次用时 " + (end4 - end3) + "ms");

	System.out.println("生成 " + resultArr + ": " + resultList + " 。");
	System.out.println("---------- ---------- ---------- ----------\n");
}


本文也在我 优快云 的博客发表: http://blog.youkuaiyun.com/shanelooli/article/details/8123094

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值