以下是测试程序运行结果:
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");
}
本文也在我 CSDN 的博客发表: http://blog.csdn.net/shanelooli/article/details/8123094
分享到:
相关推荐
java自定义 注解 annotation、标签库tag、监听listener、junit简单测试代码
JAVA反射机制自定义框架测试代码,留着以后复习用!
javapoet是一个用于生成.java源文件的java api。
Java语言其实是有个曾用名的~叫Oak,而且起这个名字...最后他们以Java这个名字命名了这个语言,据说是Sun公司的程序猿们都很喜欢喝咖啡,而且对爪哇岛的一种咖啡印象很深,所以就有了Java这个经典的名字和咖啡的图标。
能破解Java游戏本软件是一个手机端的Jar程序处理工具,可以傻瓜式地对爪哇程序进行共存、改屏、屏蔽XX等处理,速度较快,支持大文件处理,更多介绍见软件帮助
这个简单的Java项目致力于根据不同的输入构建学生考试的自动座位安排。 主要有两个实体,管理员和学生。两个实体都可以登录并注册到系统,并根据授予它们的批准检查和访问系统。管理员可以查看学生的所有相关详细...
Java的取名也有一则趣闻,有一天,几 位Java成员组的会员正在讨论给这个新的语言取什么名字,当时他们正在咖啡馆喝着Java(爪哇)咖 啡,有一个人灵机一动说就叫Java怎 样,得到了其他人的赞赏,于是,Java这个名字就...
Java处理Excel的源代码,包括将Excel文件解析成Java对象,实现对Excel对象的.属性操作。同时包括将Excel对象输出到Excel文件
Java 来自于 Sun 公司的一个叫 Green 的项目,其原先的目的是为家用消费电子 产品开发一个分布式代码系统,这样我们可以把 E-mail 发给电冰箱、电视机等 家用电器,对它们进行控制,和它们进行信息交流。开始,准备...
Java SE实践教程 pdf格式电子书 下载(二) 更新 http://download.csdn.net/source/2824040 Java SE实践教程 pdf格式电子书 下载(三) 更新 http://download.csdn.net/source/2824042 Java SE实践教程 pdf格式...
在twitter上关注@asynchttpclient。
爪哇运行环境Windows
Android-CalendarView.zip,Android上一个优雅、万能自定义UI、支持周视图、自定义周起始、性能高效的日历控件,支持热插拔实现的UI定制!支持标记、自定义颜色、农历、自定义月视图各种显示模式等。Canvas绘制,速度...
《对线面试官》是我连载了近一年的一个讲人话面试系列,我曾经通过这些资料去斩获了令人惊叹的公司的offer,基本内容介绍了Java常问的知识点... 《对线面试官第一季》纯文版 简历 【对线面试官】如何写简历 Java...
Java8简明教程、数据流教程、Nashorn教程、线程和执行器、同步和锁、原子变量和ConcurrentMap、字符串、数值、算术和文件、避免null检查、使用 Intellij IDEA 解决 Java 8 的数据流问题、在 Nashron 中使用 Backbone...
Java SE实践教程 pdf格式电子书 下载(二) 更新 http://download.csdn.net/source/2824040 Java SE实践教程 pdf格式电子书 下载(三) 更新 http://download.csdn.net/source/2824042 Java SE实践教程 pdf格式...
蔡學鏞著,趣談java程式員的心路歷程!
Java SE实践教程 源代码 2010-9-13 声明:在网上找了好久才找到这个源码,真不容易啊,请大家多多支持。 2010-9-13 内容简介:此书结合具体实例讲解,通俗易懂,又不乏深度。我觉得这本书写的确实不错,堪称经典,...
Android-ffmpeg-android-java.zip,使用HTTPS://GithuB.COM/Wrngs/FFMPEG-Android编译的FFMPEG二进制的Android Java库,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核...
Andrea.WILIER(安德列亚·威廉)VITTORIO(维托里奥)ALBERTO.BARIN(阿尔伯特·博瑞),JAVA意大利设计团队的努力,同时这个名字也是出于JAVA团队对咖啡的喜爱,所以以Java咖啡来命名。JAVA是印度尼西亚爪哇岛的...