关闭

Java自定义的二个字符串高效处理方法

发表于:2013-2-20 10:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:ShaneLooLi    来源:51Testing软件测试网采编

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

  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 次用时 1844ms

  自定义方法计算 300000 次用时 125ms

  生成 abcdefghijklmnopqrstuvwxyz 。

  ---------- ---------- ---------- ----------

  字符串按字符分割的方法。

  系统函数计算 300000 次用时 1609ms

  自定义方法计算 300000 次用时 281ms

  生成 [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)中相关方法的性能,究其原因,是因为类库为通用性,提供的相关方法,都采取了正则表达式参数。虽然编译过的正则表达式很高效,但毕竟无法和字符相等这种单拍操作相提并论。

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

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

  1. /** 
  2.  * <b>字符串删除其中某字符</b><br/> 
  3.  * 本方法用来移除指定字符串中的指定字符。 
  4.  * 在 Java 6.0 以内,删除字符串中的指定字符,需要通过 
  5.  * {@link String#replace(CharSequence, CharSequence) replace} 方法,将指定单 
  6.  * 字符的字符串,替换成空字符串来实现。而 <code>replace</code> 方法为了追求通用, 
  7.  * 使用了正则表达式参数。即便是编译过的正则表达式,其性能也无法与简单的字符相等 
  8.  * 判断相提并论。<br/> 
  9.  * 本方法不涉及正则表达式,通过遍历原字符串对应的字符数组来寻找符合待删除字符的 
  10.  * 字符,然后通过 {@link StringBuilder} 来追加其余字符。这是一个简单但高效的方法。 
  11.  * <br/> 
  12.  * 本方法编写之初,曾试图通过 <code>StringBuilder</code> 的功能来直接删除字符串 
  13.  * 中待删除字符。后经 www.iteye.com 网站用户 shenyuc629 提示,并经过考证,发现 
  14.  * {@link StringBuilder#deleteCharAt(int) deleteCharAt} 方法并不高效,应该是 
  15.  * 因为其内部每次删除都进行了数组迁移。遂改为追加方式,效率提高了 2 倍多。<br/>>> 
  16.  * 本方法使用示例如下: 
  17.  * <pre> 
  18.  * 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"; 
  19.  * String removed = StringTool.removeChar(source, ' ');</pre> 
  20.  * 此示例中,{@link String} source 为原字符串。String removed 为删除空格后的 
  21.  * 结果。 
  22.  * @see     String#replace(CharSequence, CharSequence) 
  23.  * @see     StringBuilder#append(char) 
  24.  * @param   source  待被处理的字符串,即本方法的“原字符串” 
  25.  * @param   target  需要从原字符串中移除的字符 
  26.  * @return      从指定原字符串中移除指定字符后所得的结果字符串 
  27.  * @exception   NullPointerException    当传入参数 source 为空时 
  28.  */ 
  29. static public String removeChar(String source, char target) 
  30.     StringBuilder builder = new StringBuilder(); 
  31.     for (char c: source.toCharArray()) 
  32.         if (c != target) builder.append(c); 
  33.     return builder.toString(); 
  34. }

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号