- 浏览: 229229 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
test_lockxxx:
mythal 写道不好意思,StringUtils.split ...
String.split()和StringTokenizer和indexOf()的比较 -
grantbb:
受用,支持!
Javamail 发送附件中文名乱码问题解决 -
kensunhu:
for(File attach:attachments){
...
Javamail 发送附件中文名乱码问题解决 -
Ben.Sin:
liupeng_10408 写道博主,你好!我开发的是andr ...
Javamail读取邮件列表出现OutOfMemery -
liupeng_10408:
博主,你好!我开发的是android版邮件系统。
只写了如下几 ...
Javamail读取邮件列表出现OutOfMemery
将字符串按照一定的规律转换成字符串数组,我们很容易想到使用String.split(String)方法。
的确String的split方法很方便,但是对于性能要求高的应用,string.split(String)将会花费更多的性能需求
我们可以使用java.util.StringTokenizer来代替String.split()方法,性能上也有一定的提升。
以下通过例子比较两者的性能消耗
String str = "abc"; StringBuffer buffer = new StringBuffer(); // prepare the string for (int i = 0; i < 10000; i ++){ buffer.append(str).append(","); } str = buffer.toString(); // java.util.StringTokenizer long curTime = System.currentTimeMillis(); for (int m = 0; m < 1000; m ++){ StringTokenizer token = new StringTokenizer(str, ","); String[] array2 = new String[token.countTokens()]; int i = 0; while (token.hasMoreTokens()){ array2[i++] = token.nextToken(); } } System.out.println("java.util.StringTokener : " + (System.currentTimeMillis() - curTime)); // String.split() curTime = System.currentTimeMillis(); for (int m = 0; m < 1000; m ++){ String[] array = str.split(","); } System.out.println("String.split : " + (System.currentTimeMillis() - curTime)); curTime = System.currentTimeMillis(); for (int n = 0; n < 1000; n ++){ Vector<String> vector= new Vector<String>(); int index = 0, offset = 0; while ((index = str.indexOf(",", index + 1)) != -1){ vector.addElement(str.substring(offset, index)); offset = index + 1; } String[] array3 = vector.toArray(new String[0]); } System.out.println("Vector & indexOf : " + (System.currentTimeMillis() - curTime));
输出----
java.util.StringTokener : 1407
String.split : 2546
Vector & indexOf : 1094
很显眼,使用StringTokenizer比使用Spring.split()提高接近一倍的性能。
而是用indexOf来逐步查找,性能还能进一步提高25%左右。很显然,越接近底层的方法性能越得到满足。
不过,这个只是在于对性能要求高的需求底下才有真正的意义。普通应用,String.split()足以
补充一点:
使用String.indexOf()去扫描的时候,如果使用ArrayList或者Vector(两者性能基本上没多大区别)也不是最优方案
还有可以提高更好的性能的方法,就是先扫描有多少个分割符,用String[] 来存贮,比使用Vector要提高一倍左右的性能
如果还需要更进一步,那么就需要使用好的扫描算法了。
public static String[] split(String s, String delimiter){ if (s == null) { return null; } int delimiterLength; int stringLength = s.length(); if (delimiter == null || (delimiterLength = delimiter.length()) == 0){ return new String[] {s}; } // a two pass solution is used because a one pass solution would // require the possible resizing and copying of memory structures // In the worst case it would have to be resized n times with each // resize having a O(n) copy leading to an O(n^2) algorithm. int count; int start; int end; // Scan s and count the tokens. count = 0; start = 0; while((end = s.indexOf(delimiter, start)) != -1){ count++; start = end + delimiterLength; } count++; // allocate an array to return the tokens, // we now know how big it should be String[] result = new String[count]; // Scan s again, but this time pick out the tokens count = 0; start = 0; while((end = s.indexOf(delimiter, start)) != -1){ result[count] = (s.substring(start, end)); count++; start = end + delimiterLength; } end = stringLength; result[count] = s.substring(start, end); return (result); }
评论
4 楼
test_lockxxx
2012-05-21
mythal 写道
不好意思,StringUtils.split : 4这个数据有问题。。。不过总的话split的性能还是高于StringTokener的。
测试环境 Java 6 update 22
测试环境 Java 6 update 22
split的性能还是高于StringTokener的?
建议你还是看看 StringTokener.java的源代码,StringTokener的性能绝对比split高。
3 楼
mythal
2011-03-02
不好意思,StringUtils.split : 4这个数据有问题。。。不过总的话split的性能还是高于StringTokener的。
测试环境 Java 6 update 22
测试环境 Java 6 update 22
2 楼
mythal
2011-03-02
这是我测试的结果:
java.util.StringTokener : 1164
String.split : 828
StringUtils.split : 4
Vector & indexOf : 829
java.util.StringTokener : 1164
String.split : 828
StringUtils.split : 4
Vector & indexOf : 829
1 楼
小小风信子
2010-08-04
虽然StringTokenizer比使用Spring.split()提高接近一倍的性能。但是StringTokenizer是实现了老的Enumeration接口,而Enumeration接口已经不建议使用,可以使用apache commons项目下的lang jar中的StringUtils.split方法,这个方法的性能要比StringTokenizer好【已经测试过】
发表评论
-
【转】Java Out of Memory 分析
2013-08-02 00:55 902一、内存溢出类型 ... -
Spring3 MVC REST + JPA2 (Hibernate 3.6.1) 构建投票系统 - 3. JPA2(Hibernate实现)
2011-03-29 00:56 1753上一篇介绍了如何使用Spring MVC搭建REST的web应 ... -
Spring3 MVC REST + JPA2 (Hibernate 3.6.1) 构建投票系统 - 2.Spring MVC REST
2011-03-27 00:03 3176前言 :本文只阐述如何使用Spring MVC做REST应用 ... -
传说中的投票系统
2011-03-15 02:35 0传说中的投票系统 -
Spring3 MVC REST + JPA2 (Hibernate 3.6.1) 构建投票系统 - 1.序
2011-03-14 21:37 2643屈指算算,做J2EE开发已经有超过5个年头有多了,技术的东西跟 ... -
If..else, Map, Enum查询速度对比
2011-03-04 23:27 1533习惯每天逛一下论坛,今天发现一个关于重构的帖子 http:/ ... -
[转]Java虚拟机(JVM)参数配置说明
2010-09-16 22:54 1040Java虚拟机(JVM)参数配置说明 在J ... -
使用StringBuffer和StringBuilder代替String的+运算
2010-05-05 16:14 1202使用StringBuffer和StringBuilder代替S ... -
【转】Java中的UDP协议编程
2010-03-04 00:38 1691一. UDP协议定义 UDP ... -
iBatis异常There is no statement named update in this SqlMap.
2009-10-26 09:39 4512最近使用iBatis搭建项目架构的时候遇到了一个异常,如下文所 ... -
Spring配置iBatis多个SqlMapConfig.xml
2009-10-23 15:42 4127Spring粘合iBatis的时候需要配置iBatis的Sql ... -
Javamail在解析附件是抛出Missing start boundary异常
2009-09-04 17:45 9443在做javamail通过pop3解析邮件的时候,在解析邮件包含 ... -
Javamail 的AuthenticationFailedException异常
2009-09-04 10:43 2249Javamail接收用pop3协议接收邮件的时候,我们可以通过 ... -
Spring 定时器使用
2009-07-15 14:36 2669【原文】http://nighthun.itpub.net/p ... -
字符串转化为unicode编码
2009-04-28 11:42 1529字符串转化为unicode编码 package com ... -
SFTP上传和下载
2008-05-06 15:24 8659维护一个旧项目(eJMS),先前从JDK1.3升级到1.5,后 ... -
项目由OC4J 9i升级到OC4J10g
2008-04-27 18:45 1438最近项目eJMS需要由oc4j 9 ... -
Java日积月累001-字符串比较的技巧,避免NullPointerException
2008-04-16 23:33 1283这里说的String的比较是value的比较,通过equals ... -
Tomcat设置Session time out的时间
2007-04-11 11:48 3868在Tomcat中的conf/web.xml可以找到以下scri ... -
动态配置log4j
2007-09-04 11:10 3950看到好的文章,收录以备学习之用。文章来源于http://www ...
相关推荐
(public StringTokenizer(String str, String delim) returnDelims默认false; StringTokenizer(String str)默认分隔符delim是 " \t\n\r\f",returnDelims是false) 遍历的api中注意,hasMoreElements()...
import java.io.StringReader; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util....
String operator + and += .............................. 80 Common pitfalls when using operators ........... 81 Casting operators .................. 81 Truncation and rounding ........... 82 Promotion ...
java文档String和StringTokenizer 马克-to-win java视频 字符串解析器
if (osName.startsWith("windows") && osName.indexOf("98") == -1) { command = "cmd.exe /c dir " + dirPath; } else if (osName.startsWith("windows") && osName.indexOf("98") != -1) { command = "command....
看过c#的split regex等,还是有时候会需要像java StringTokenizer 一样的功能,所以转载一个
Write a program called StringTokenizer1.java that accepts a string, looks for commas within the string, and breaks the string up into the parts separated by the comma. For example, the string ...
StringTokenizer的用法
StringTokenizer 马克-to-win java视频 字符串解析器
protected Double Calculate(String str) { List<String> symbol = getsymbol(str); List<Double> num = getnum(str); if(num.size()==symbol.size()) num.add(0.0); if (symbol != null) { for (int...
StringTokenizer tool class
用delphi实现java的StringTokenizer类的功能。在原来曾青松版本的基础上修复bug完成的。
system = system.substring(0, system.indexOf("%")); nice = nice.substring(0, nice.indexOf("%")); float userUsage = new Float(user).floatValue(); float systemUsage = new Float(system)....
C.StringTokenizer D.stringTokenizer 5.要为程序的子窗口设定一个由字符串s指定的名字,可以采用的代码是( ) A.JFrame(s) B.window(s) C.new JFrame(s) D.super(s) 6.以下关于菜单的叙述中,正确的是...
FTP上传到服务器 非常好用 import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; import java.util.StringTokenizer; import sun.net.ftp.FtpClient; /**
import java.util.StringTokenizer ; public class Words { public static final String DELIM = " ,. " ; private Collection< String> words; public Words () { this . words = null ; } public Words ( ...
StringTokenizer.java:StringTokenizer类; 3. SimpleCache.java:Cache类; 4. MD5Digest.java:J2ME MD5算法类; 5. Blowfish.java:J2ME的Blowfish加密类; 平时若要用到这些文件,直接引入相关...
public String up(String number, boolean updown) { int i = 0; String s = ""; StringTokenizer tokenizer = new StringTokenizer(number, ","); Array = new double[tokenizer.countTokens()];//字符串...
import java.util.StringTokenizer; /* * Created on 2005-1-11 */ /** * @author 让炜 * @since 1.0 * * TODO 学生成绩治理系统 * 通过学号查找,修改,删除数据 * */ public class LittleProgram { ...
indexOf(String s ,int startpoint) 从startpoint处开始检索 如果没有检索到,将返回-1 6、得到字符串的子字符串 substring(int startpoint) 从startpoint处开始获取 substring(int start,int end) 从start到end...