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

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

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

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

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

  

    /***<b>字符串删除其中某字符</b><br/>*本方法用来移除指定字符串中的指定字符。*在Java6.0以内,删除字符串中的指定字符,需要通过*{@linkString#replace(CharSequence,CharSequence)replace}方法,将指定单*字符的字符串,替换成空字符串来实现。而<code>replace</code>方法为了追求通用,*使用了正则表达式参数。即便是编译过的正则表达式,其性能也无法与简单的字符相等*判断相提并论。<br/>*本方法不涉及正则表达式,通过遍历原字符串对应的字符数组来寻找符合待删除字符的*字符,然后通过{@linkStringBuilder}来追加其余字符。这是一个简单但高效的方法。*<br/>*本方法编写之初,曾试图通过<code>StringBuilder</code>的功能来直接删除字符串*中待删除字符。后经网站用户shenyuc629提示,并经过考证,发现*{@linkStringBuilder#deleteCharAt(int)deleteCharAt}方法并不高效,应该是*因为其内部每次删除都进行了数组迁移。遂改为追加方式,效率提高了2倍多。<br/>>>*本方法使用示例如下:*<pre>*Stringsource=”abcdefghijklmnopqrstuvwxyz”;*Stringremoved=StringTool.removeChar(source,”);</pre>*此示例中,{@linkString}source为原字符串。Stringremoved为删除空格后的*结果。*@seeString#replace(CharSequence,CharSequence)*@seeStringBuilder#append(char)*@paramsource待被处理的字符串,即本方法的“原字符串”*@paramtarget需要从原字符串中移除的字符*@return从指定原字符串中移除指定字符后所得的结果字符串*@exceptionNullPointerException当传入参数source为空时*/staticpublicStringremoveChar(Stringsource,chartarget){StringBuilderbuilder=newStringBuilder();for(charc:source.toCharArray())if(c!=target)builder.append(c);returnbuilder.toString();}

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

  

    /***<b>简易字符串分割</b><br/>*本方法用来根据指定字符,将某字符串以此为分割,拆分成多个子字符串。*对于分割字符串功能,在Java6.0以内,都只提供了支持正则表达式的*{@linkString#split(String)split}方法。此方法为追求通用,即便是简单的*分割,也会基于正则表达式来进行。即便是编译过的正则表达式,其性能也无法与简单*的字符相等判断相提并论。<br/>*本方法不涉及正则表达式,通过遍历原字符串对应的字符数组来寻找符合分割字符的*字符,然后通过{@linkString#substring(int,int)}来获取每一个分割字符之间*的子字符串,存入一个{@linkLinkedList}中。这是一个功能简单但高效的方法。*如果规模比较大,拟考虑先通过一次循环,取得原字符串中分割字符的数量,以此制作*定长的{@linkArrayList}。*本方法尤其适用于常见的由半角逗号结合在一起的字符串的分割。<br/>*在编写之初,本方法曾采取将字符串的字符数组分段处理,通过系统字符串复制来形成*一个个子字符串。后经考证,{@linkString#substring(int,int)}是一个很高效的*方法,遂改。效率提高了一倍。*本方法使用示例如下:*<pre>*Stringsource=”abcdefghijklmnopqrstuvwxyz”;*List<String>secs=StringTool.splitSimpleString(source,”);</pre>*此示例中,{@linkString}source为原字符串。{@linkList}secs为删除空格后*的结果。*@seeString#split(String)*@seeString#substring(int,int)*@paramsource待被处理的字符串,即本方法的“原字符串”*@paramgap分割字符*@return从指定原字符按分割字符拆分成的子字符串列表*@exceptionNullPointerException当传入参数source为空时*/staticpublicList<String>splitSimpleString(Stringsource,chargap){List<String>result=newLinkedList<String>();char[]sourceChars=source.toCharArray();Stringsection=null;intstartIndex=0;for(intindex=-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);returnresult;}

  最后是测试程序。

  

    staticpublicvoidmain(String[]arguments){//准备测试内容Stringsource=”abcdefghijklmnopqrstuvwxyz”;System.out.println(“source=”+source);intloop=300000;StringresultString=null;List<String>resultList=null;String[]resultArr=null;intindex=-1;longstart=Calendar.getInstance().getTimeInMillis();System.out.println(“字符串中删除字符的方法。”);//测试Java类库提供的字符串删除某字符index=-1;while(++index!=loop)resultString=source.replace(“”,””);longend1=Calendar.getInstance().getTimeInMillis();System.out.println(“系统函数计算”+loop+”次用时”+(end1-start)+”ms”);//测试自定义的字符串删除某字符index=-1;while(++index!=loop)resultString=StringTool.removeChar(source,”);longend2=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(“”);longend3=Calendar.getInstance().getTimeInMillis();System.out.println(“系统函数计算”+loop+”次用时”+(end3-end2)+”ms”);//测试自定义的字符串按某字符分割index=-1;while(++index!=loop)resultList=StringTool.splitSimpleString(source,”);longend4=Calendar.getInstance().getTimeInMillis();System.out.println(“自定义方法计算”+loop+”次用时”+(end4-end3)+”ms”);System.out.println(“生成”+resultArr+”:”+resultList+”。”);System.out.println(“—————————————-\n”);}

不会因为别人显赫的成功而促使自己有卓越的进步。

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

相关文章:

你感兴趣的文章:

标签云: