- 浏览: 91824 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
满手都是炸:
写的真好 学习了
「向副经理学习」之一 -
zjuttsw:
Map.Entry不是接口吗?
内部类详解 -
tanjianna:
在linux 怎么办?求大神!
flying saucer 使用中的一些问题 (java导出pdf) -
linweibin:
真是佩服死了~~
Java 7 新特性 -- 实战篇 -
yanbin0830:
中文问题,如果系统装在D盘呢? 如果lunux 没有这个字体呢 ...
flying saucer 使用中的一些问题 (java导出pdf)
前几天看一个老帖子
http://www.iteye.com/topic/7279?page=2
其中凤舞凰扬前辈说到了StringTokenizer。
之前没接触过StringTokenizer,看上去类名很长,仿佛很牛13似的。最近了解了一下
StringTokenizer 类允许应用程序将字符串分解为标记
也就是分解字符串用的
让我们来看一个简单的例子
出去结果如下
这种不带参数的StringTokenizer使用的分隔符是\t\n\r\f,即空白字符、制表符、换行符、回车符和换页符。
ok,StringTokenizer还提供了另一种构造方法,StringTokenizer(String str, String delim)
从名字上看,可以知道,我们可以自定义delimiter。那么,这个delimiter是不是可以为正则表达式呢?满怀期待的试验一下
本以为结果会是
哪知一看,结果为
可见,StringTokenizer的delimeter不可以为正则表达式
替代方法?
首先,来看String的split方法
输出结果为
ok,正确。String的split方法接受的参数可以为正则表达式。
我们可以看一下split方法的定义
其实这个参数他们就是按正则表达式来对待的。(哎,我一直以为只能是字符呢 )
接着来看Scanner的表现。
一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器
同样的,通过设置Delimiter(可以为正则表达式),我们可以很轻松的拆分字符串
输出结果为
另外,还可以使用Pattern类的split方法,我觉得这个和String的split方法差不多。(Pattern类主要不是用在拆分字符串,而是在正则表达式的应用那里)
结果同样为
好了,现在已经知道的就有三种方式来代替StringTokenizer了,并且由于StringTokenizer只能做一些很简单的拆分,远不能适应现在的要求,所以,StringTokenizer,你可以放心的撤退了,远离历史舞台吧。
其实sun也知道这个
<tt>StringTokenizer</tt> is a legacy class that is retained for
* compatibility reasons although its use is discouraged in new code. It is
* recommended that anyone seeking this functionality use the <tt>split</tt>
* method of <tt>String</tt> or the java.util.regex package instead.
ps:那个老帖子是04年的。也许那会还没有这么多的替代方法。
不过5年过去了。StringTokenizer就不要再用了。
StringTokenizer,洗洗睡吧。
循环外面。
只用一个Pattern
然后当成参数传进去。这就是dennis_zane大哥说的缓存吧。
明白?
刚试了下,确实是这样的。
不知道为什么。有空了看下源代码。
讨论技术,就严谨点。
有没有用,写点例子,具体来说说啊。
看来我还是没理解错啊,我试了下,感觉速度也没怎么快啊。。。好像还有慢的趋势。。
循环外面。
只用一个Pattern
然后当成参数传进去。这就是dennis_zane大哥说的缓存吧。
明白?
刚试了下,确实是这样的。
不知道为什么。有空了看下源代码。
讨论技术,就严谨点。
有没有用,写点例子,具体来说说啊。
哦,改了一下。
将Pattern改在了外面,比上面能快了些。
但和StringTokenizer比还是3点几倍
有一点不明白。既然有这个差距了,sun为什么不鼓励我们使用它了呢?难道sun没有测试这个的性能
运行了五次。输出结果如下:
StringTokenizer最快
Scanner最慢。
String和Pattern速度差不多。Pattern稍快些。
没有考察过性能。
有时间了,我测试一下。然后补充。
不过不知道不需要正则的切分用处多不多。
很多的是,比如我过去干过的用StringTokenizer来切分memcached文本协议,就比用Pattern.split快多了。
我简单的测试了下。的确是它最快。
不知道我的测试结果科学不科学,请指教
没有考察过性能。
有时间了,我测试一下。然后补充。
不过不知道不需要正则的切分用处多不多。
很多的是,比如我过去干过的用StringTokenizer来切分memcached文本协议,就比用Pattern.split快多了。
没有考察过性能。
有时间了,我测试一下。然后补充。
不过不知道不需要正则的切分用处多不多。
也许是那些经典教材出版时间比较早。
连sun都不鼓励我们用了,呵呵
http://www.iteye.com/topic/7279?page=2
其中凤舞凰扬前辈说到了StringTokenizer。
之前没接触过StringTokenizer,看上去类名很长,仿佛很牛13似的。最近了解了一下
引用
StringTokenizer 类允许应用程序将字符串分解为标记
也就是分解字符串用的
让我们来看一个简单的例子
StringTokenizer st = new StringTokenizer("this is a test"); while (st.hasMoreTokens()) { System.out.println(st.nextToken()); }
出去结果如下
this is a test
这种不带参数的StringTokenizer使用的分隔符是\t\n\r\f,即空白字符、制表符、换行符、回车符和换页符。
ok,StringTokenizer还提供了另一种构造方法,StringTokenizer(String str, String delim)
从名字上看,可以知道,我们可以自定义delimiter。那么,这个delimiter是不是可以为正则表达式呢?满怀期待的试验一下
String input = "This is just a test"; //设想的delimiter可以为正则表达式 StringTokenizer st = new StringTokenizer(input,"\\s{1}"); while(st.hasMoreTokens()){ System.out.println(st.nextToken()); }
本以为结果会是
this is a test
哪知一看,结果为
Thi i ju t a te t
可见,StringTokenizer的delimeter不可以为正则表达式
替代方法?
首先,来看String的split方法
String input = "This is just a test"; String [] str = input.split("\\s{1}"); for(int i=0;i<str.length;i++){ System.out.println(str[i]); }
输出结果为
this is a test
ok,正确。String的split方法接受的参数可以为正则表达式。
我们可以看一下split方法的定义
public String[] split(String regex) { return split(regex, 0); }
其实这个参数他们就是按正则表达式来对待的。(哎,我一直以为只能是字符呢 )
接着来看Scanner的表现。
引用
一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器
Scanner scanner = new Scanner(input); scanner.useDelimiter("\\s{1}"); while(scanner.hasNext()){ System.out.println(scanner.next()); }
同样的,通过设置Delimiter(可以为正则表达式),我们可以很轻松的拆分字符串
输出结果为
This is just a test
另外,还可以使用Pattern类的split方法,我觉得这个和String的split方法差不多。(Pattern类主要不是用在拆分字符串,而是在正则表达式的应用那里)
Pattern pattern = Pattern.compile("\\s{1}"); str = pattern.split(input); for(int i=0;i<str.length;i++){ System.out.println(str[i]); }
结果同样为
This is just a test
好了,现在已经知道的就有三种方式来代替StringTokenizer了,并且由于StringTokenizer只能做一些很简单的拆分,远不能适应现在的要求,所以,StringTokenizer,你可以放心的撤退了,远离历史舞台吧。
其实sun也知道这个
sun 写道
<tt>StringTokenizer</tt> is a legacy class that is retained for
* compatibility reasons although its use is discouraged in new code. It is
* recommended that anyone seeking this functionality use the <tt>split</tt>
* method of <tt>String</tt> or the java.util.regex package instead.
ps:那个老帖子是04年的。也许那会还没有这么多的替代方法。
不过5年过去了。StringTokenizer就不要再用了。
StringTokenizer,洗洗睡吧。
评论
18 楼
logicgate
2009-09-19
支持火星人,支持基础贴,给个良好!
17 楼
zhouxiang_fly
2009-09-18
kaka2008 写道
zhouxiang_fly 写道
额,弱弱的问一下,将Pattern改在外面是如何改的。。。
循环外面。
只用一个Pattern
然后当成参数传进去。这就是dennis_zane大哥说的缓存吧。
public static void test4(Pattern pattern){ String input = "This is 1 just a test"; String [] str = pattern.split(input); for(int i=0;i<str.length;i++){ String s = str[i]; } } public static void main(String [] args){ Pattern pattern = Pattern.compile("\\s{1}"); start = System.currentTimeMillis(); for(int i=0;i<100000;i++){ test4(pattern); } end = System.currentTimeMillis(); System.out.println("Pattern: "+(end-start)); }
明白?
humaeks 写道
我没记错的话ST遇到"|" 作为字段分隔符会死。
刚试了下,确实是这样的。
不知道为什么。有空了看下源代码。
treblesoftware 写道
哈哈,洗洗睡还太早,这东西好象还有些用。
讨论技术,就严谨点。
有没有用,写点例子,具体来说说啊。
看来我还是没理解错啊,我试了下,感觉速度也没怎么快啊。。。好像还有慢的趋势。。
16 楼
mrushui
2009-09-18
split是可以使用"|"的,写作split("\\|")就行了。
15 楼
whaosoft
2009-09-18
为什么sun都不鼓励用了~~
14 楼
fuliang
2009-09-18
不支持正则风格,肯定要比使用了正则的要快了,如果你只是简单的分割,使用StringTokenizer还是很好的。从其他语言也可以见到类似的并存问题,如php的explode和
preg_split。
preg_split。
13 楼
kaka2008
2009-09-18
zhouxiang_fly 写道
额,弱弱的问一下,将Pattern改在外面是如何改的。。。
循环外面。
只用一个Pattern
然后当成参数传进去。这就是dennis_zane大哥说的缓存吧。
public static void test4(Pattern pattern){ String input = "This is 1 just a test"; String [] str = pattern.split(input); for(int i=0;i<str.length;i++){ String s = str[i]; } } public static void main(String [] args){ Pattern pattern = Pattern.compile("\\s{1}"); start = System.currentTimeMillis(); for(int i=0;i<100000;i++){ test4(pattern); } end = System.currentTimeMillis(); System.out.println("Pattern: "+(end-start)); }
明白?
humaeks 写道
我没记错的话ST遇到"|" 作为字段分隔符会死。
刚试了下,确实是这样的。
不知道为什么。有空了看下源代码。
treblesoftware 写道
哈哈,洗洗睡还太早,这东西好象还有些用。
讨论技术,就严谨点。
有没有用,写点例子,具体来说说啊。
12 楼
treblesoftware
2009-09-18
哈哈,洗洗睡还太早,这东西好象还有些用。
11 楼
humaeks
2009-09-18
我没记错的话ST遇到"|" 作为字段分隔符会死。
10 楼
zhouxiang_fly
2009-09-18
额,弱弱的问一下,将Pattern改在外面是如何改的。。。
9 楼
kaka2008
2009-09-18
dennis_zane 写道
Pattern可以缓存的,编译一次后重复使用,而不要每次都重新compile。String.split很方便,但是如果调用频繁,还是会造成性能影响,因此在频繁调用的地方,更推荐直接用Pattern.split,并且缓存Pattern.
哦,改了一下。
将Pattern改在了外面,比上面能快了些。
但和StringTokenizer比还是3点几倍
有一点不明白。既然有这个差距了,sun为什么不鼓励我们使用它了呢?难道sun没有测试这个的性能
8 楼
dennis_zane
2009-09-18
Pattern可以缓存的,编译一次后重复使用,而不要每次都重新compile。String.split很方便,但是如果调用频繁,还是会造成性能影响,因此在频繁调用的地方,更推荐直接用Pattern.split,并且缓存Pattern.
7 楼
kaka2008
2009-09-18
public static void main(String [] args){ long start = System.currentTimeMillis(); for(int i=0;i<100000;i++){ test1(); } long end = System.currentTimeMillis(); System.out.println("StringTokenzier: "+(end-start)); start = System.currentTimeMillis(); for(int i=0;i<100000;i++){ test2(); } end = System.currentTimeMillis(); System.out.println("Scanner: "+(end-start)); start = System.currentTimeMillis(); for(int i=0;i<100000;i++){ test3(); } end = System.currentTimeMillis(); System.out.println("String: "+(end-start)); start = System.currentTimeMillis(); for(int i=0;i<100000;i++){ test4(); } end = System.currentTimeMillis(); System.out.println("Pattern: "+(end-start)); } //用StringTokenizer public static void test1(){ String input = "This is 1 just a test"; StringTokenizer st = new StringTokenizer(input); while(st.hasMoreTokens()){ String s = st.nextToken(); } } //用Scanner的方法 public static void test2(){ String input = "This is 1 just a test"; Scanner scanner = new Scanner(input); scanner.useDelimiter(" "); while(scanner.hasNext()){ String s = scanner.next(); } } //用String的split方法 public static void test3(){ String input = "This is 1 just a test"; String [] str = input.split(" "); for(int i=0;i<str.length;i++){ String s = str[i]; } } //用Pattern的方法 public static void test4(){ Pattern pattern = Pattern.compile(" "); String input = "This is 1 just a test"; String [] str = pattern.split(input); for(int i=0;i<str.length;i++){ String s = str[i]; } }
运行了五次。输出结果如下:
StringTokenzier: 110 Scanner: 3281 String: 453 Pattern: 438 StringTokenzier: 109 Scanner: 3297 String: 453 Pattern: 438 StringTokenzier: 110 Scanner: 3265 String: 485 Pattern: 437 StringTokenzier: 109 Scanner: 3266 String: 469 Pattern: 437 StringTokenzier: 109 Scanner: 3297 String: 469 Pattern: 422
StringTokenizer最快
Scanner最慢。
String和Pattern速度差不多。Pattern稍快些。
6 楼
kaka2008
2009-09-18
dennis_zane 写道
kaka2008 写道
dennis_zane 写道
不知道你有没有考察过性能。。如果不需要正则,并且切分非常频繁的话,StringTokenizer快上很多。
没有考察过性能。
有时间了,我测试一下。然后补充。
不过不知道不需要正则的切分用处多不多。
很多的是,比如我过去干过的用StringTokenizer来切分memcached文本协议,就比用Pattern.split快多了。
我简单的测试了下。的确是它最快。
不知道我的测试结果科学不科学,请指教
5 楼
dennis_zane
2009-09-18
kaka2008 写道
dennis_zane 写道
不知道你有没有考察过性能。。如果不需要正则,并且切分非常频繁的话,StringTokenizer快上很多。
没有考察过性能。
有时间了,我测试一下。然后补充。
不过不知道不需要正则的切分用处多不多。
很多的是,比如我过去干过的用StringTokenizer来切分memcached文本协议,就比用Pattern.split快多了。
4 楼
kaka2008
2009-09-18
dennis_zane 写道
不知道你有没有考察过性能。。如果不需要正则,并且切分非常频繁的话,StringTokenizer快上很多。
没有考察过性能。
有时间了,我测试一下。然后补充。
不过不知道不需要正则的切分用处多不多。
3 楼
dennis_zane
2009-09-18
不知道你有没有考察过性能。。如果不需要正则,并且切分非常频繁的话,StringTokenizer快上很多。
2 楼
kaka2008
2009-09-18
snowolf 写道
目前很多书还是要求使用这个类,甚至包括经典教材,呵呵!
也许是那些经典教材出版时间比较早。
连sun都不鼓励我们用了,呵呵
1 楼
snowolf
2009-09-18
目前很多书还是要求使用这个类,甚至包括经典教材,呵呵!
发表评论
-
实用java生成word
2011-07-01 15:21 0java导出word,普通的功能请看zl-2577同学的 ... -
做压力测试时疑似被防火墙拦截
2011-06-12 23:22 2019系统部署到正式服务器上,要做压力测试。 昨天在 ... -
flying saucer 使用中的一些问题 (java导出pdf)
2011-04-17 23:42 17708flying saucer(源代码托管在github http ... -
正则表达式替换
2011-01-24 23:01 0好久不用java的正则表达式了,去年看TIJ时看了一阵子,现在 ... -
spring security遇到的问题
2010-11-09 19:40 1420项目中使用到了spring security,第一次使用 ... -
记录项目中遇到的问题
2010-08-26 10:07 1012对pojo采用annotation方式,而不是hbm文件 sp ... -
jxl解析excel时一个诡异的错误
2010-06-13 15:47 2569上周用jxl解析excel时,遇到了一个很诡异的问题。 抛出的 ... -
关于泛型
2009-11-20 17:05 969昨晚终于看tij第15章泛型看完了,看到后期,完全就是看 ... -
Collection总结
2009-08-26 17:21 12921、数组将数字与对象联系起来。它保存类型明确的对象,查询对象时 ... -
java可变参数
2009-08-19 16:41 2287在动态语言,如ruby中, ... -
内部类详解
2009-08-07 15:48 6232内部类详解 1、定义 一个类的定义放在另一个类的内部,这个 ... -
初始化
2009-06-11 10:13 957java初始化 1、 一个类的所有基本类型数据成员都会保证获得 ...
相关推荐
import java.util.StringTokenizer; /** * * @author lushuaiyin * */ public class StringTokenizerTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated...
看过c#的split regex等,还是有时候会需要像java StringTokenizer 一样的功能,所以转载一个
StringTokenizer的用法
用delphi实现java的StringTokenizer类的功能。在原来曾青松版本的基础上修复bug完成的。
StringTokenizer tool class
本段代码 用于测试StringTokenizer用法/** * 测试StringTokenizer,继承Enumeration; * @author DELL */
下面小编就为大家带来一篇基于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 ...
主要介绍了JAVA StringBuffer类与StringTokenizer类代码解析,具有一定借鉴价值,需要的朋友可以参考下
StringTokenizer 马克-to-win java视频 字符串解析器
StringTokenizer 马克-to-win java视频 字符串解析器
Java 实例 - 字符串分隔(StringTokenizer)源代码-详细教程.zip
java文档String和StringTokenizer 马克-to-win java视频 字符串解析器
Java-StringTokenizer1 这个文件解释了 StringTokenizer 的工作。
编写一个程序,输入一行文本,采用StringTokenizer类的对象,将文本符号化,并以逆序输出语言符号。
java常用类的使用方法
Arduino-StringTokenizer-库一个非常简单的arduino库,可以使用Java(如string-tokenizer函数)来使用定界符分割字符串。 基本说明: 参数:用于标记化的字符串; 分隔符字符串职能 : (boolean)hasNext()-如果...
StringTokenizer类的使用方法
StringTokenizer commaToker = new StringTokenizer(source,","); String[] result = new String[commaToker.countTokens()]; int i=0; while(commaToker.hasMoreTokens()){ result[i] = commaToker.nextToken...
StringTokenizer tokenizer = new StringTokenizer(str, "0123456789."); List<String> ops = new ArrayList(); while (tokenizer.hasMoreElements()) { String string = tokenizer.nextToken(); ops....