`
kaka2008
  • 浏览: 91595 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

StringTokenizer,洗洗睡吧

    博客分类:
  • java
阅读更多
前几天看一个老帖子
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,洗洗睡吧。
分享到:
评论
38 楼 test_lockxxx 2012-05-21  
StringTokenizer.java,看看他的源代码,然后与split()源代码相对比,用膝盖想,也知道哪个性能更高。

支持正则表达式,方便是方便,但有得必有失。

37 楼 liyuan1943 2010-03-15  
学习了,谢谢
36 楼 mercyblitz 2010-03-15  
kaka2008 写道
dennis_zane 写道
不知道你有没有考察过性能。。如果不需要正则,并且切分非常频繁的话,StringTokenizer快上很多。


没有考察过性能。
有时间了,我测试一下。然后补充。
不过不知道不需要正则的切分用处多不多。



不少,Pattern#split方法用于相对复杂的情况,简单的逗号之类用StringTokenizer快很多。
35 楼 devworks 2009-12-10  
StringTokenizer的缺点是
StringTokenizer(String input,String delimiter)
delimiter不是一个整体,而是其中任一字符都作为分隔符。
34 楼 wujiazhao88 2009-12-10  
我还是用String的split用的多,功能也强大。。
33 楼 w0017 2009-09-24  
看java的源码,string和pattern就是一回事
s的方法就是简单处理下然后调用了pattern的
性能方面没注意过。
32 楼 C_J 2009-09-24  
javaeyes 写道
NND, StringTokenizer, String.split, Pattern都有源码, 为啥一个个都不去看呢?
争吵这些无谓的东西。  我看该投新手帖!!!!!!


呵呵  不是每个人在开发的时候都带SRC.ZIP的

刚也是翻了String的实现,调用Pattern的实现而已;

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence
{
...
    /*
     * @see java.util.regex.Pattern
     *
     * @since 1.4
     * @spec JSR-51
     */
    public String[] split(String regex, int limit) {
	return Pattern.compile(regex).split(this, limit);
    }

...
}



31 楼 blackartanan 2009-09-23  
husai 写道
blackartanan 写道
弱弱的问句 如果需要分隔符也输出的话 用什么来替代StringTokenizer 更好
比如字符串"11;22;33"分割符为";" 希望输出的结果是"11 ; 22 ; 33"

那就没必要分割了嘛...
或是自己再做一个字符串处理


如果用这样的需求呢 StringTokenizer可以方便的实现 省的自己做了 其他的类还有可以实现的吗
30 楼 javaeyes 2009-09-23  
NND, StringTokenizer, String.split, Pattern都有源码, 为啥一个个都不去看呢?
争吵这些无谓的东西。  我看该投新手帖!!!!!!
29 楼 dfx306956205 2009-09-22  
不错,不错~这个性能问题还真没太注意啊!不错!!
28 楼 maxwee 2009-09-22  
写的不错。
27 楼 highkay 2009-09-21  
kaka2008 写道
上面有个同学说遇到这样一个问题,那天我也回复说,确实是这样
humaeks 写道
我没记错的话ST遇到"|" 作为字段分隔符会死。

觉得怪怪的,早上看了下String的split的实现。
    public String[] split(String regex, int limit) {
       return Pattern.compile(regex).split(this, limit);
    }

原来是调用Pattern来实现的。所以应该比Pattern要稍慢一些。正如上面测试结果显示的那样。
又看了下Pattern的实现,里面用到了Matcher(处理正则表达式的),然后我就想,| 不可能出不来啊。

那天yuan来提醒我说,是不是我测试时将 | 直接写成了 |,忽略了它在正则表达式中是一个关键字啊,但我并没有,我写的是\\|。今天回头一看,我狂晕,将测试代码写错了。
写成了这样
        String input = "This|is|just|a|test";
        StringTokenizer st = new StringTokenizer(input,"|");
	while(st.hasMoreTokens()){
		String s = st.nextToken();
	}
        Pattern pattern = Pattern.compile("\\|");
	String [] str = pattern.split(input);
	for(int i=0;i<str.length;i++){
		String s = str[i];
	}

我说怎么输不出东西呢。囧。
改过来以后,是没有问题的。
StringTokenizer里因为是不能用正则表达式的,所以输入|就可以
而String的split方法,因为是用正则表达式实现效果,所以写的时候,必须用转义符号 \\|.

如果是java me的话,st足够了。
26 楼 kaka2008 2009-09-21  
上面有个同学说遇到这样一个问题,那天我也回复说,确实是这样
humaeks 写道
我没记错的话ST遇到"|" 作为字段分隔符会死。

觉得怪怪的,早上看了下String的split的实现。
    public String[] split(String regex, int limit) {
       return Pattern.compile(regex).split(this, limit);
    }

原来是调用Pattern来实现的。所以应该比Pattern要稍慢一些。正如上面测试结果显示的那样。
又看了下Pattern的实现,里面用到了Matcher(处理正则表达式的),然后我就想,| 不可能出不来啊。

那天yuan来提醒我说,是不是我测试时将 | 直接写成了 |,忽略了它在正则表达式中是一个关键字啊,但我并没有,我写的是\\|。今天回头一看,我狂晕,将测试代码写错了。
写成了这样
        String input = "This|is|just|a|test";
        StringTokenizer st = new StringTokenizer(input,"|");
	while(st.hasMoreTokens()){
		String s = st.nextToken();
	}
        Pattern pattern = Pattern.compile("\\|");
	String [] str = pattern.split(input);
	for(int i=0;i<str.length;i++){
		String s = str[i];
	}

我说怎么输不出东西呢。囧。
改过来以后,是没有问题的。
StringTokenizer里因为是不能用正则表达式的,所以输入|就可以
而String的split方法,因为是用正则表达式实现效果,所以写的时候,必须用转义符号 \\|.
25 楼 husai 2009-09-21  
blackartanan 写道
弱弱的问句 如果需要分隔符也输出的话 用什么来替代StringTokenizer 更好
比如字符串"11;22;33"分割符为";" 希望输出的结果是"11 ; 22 ; 33"

那就没必要分割了嘛...
或是自己再做一个字符串处理
23 楼 swen00 2009-09-20  
巩固下基础,过时的方法,很少用到。
不错,难得有心写下来,良好一票,哈哈。
22 楼 xieyongwei 2009-09-20  
刚买了本书,《java 软件结构与数据结构》(第三版) 最新的哦
栈的实现中就是用这个类举了个例子。
21 楼 androidnew 2009-09-20  
StringTokenizer .. sun喊你回家吃饭
StringTokenizer, 你妈妈喊你回家吃饭

20 楼 blackartanan 2009-09-20  
弱弱的问句 如果需要分隔符也输出的话 用什么来替代StringTokenizer 更好
比如字符串"11;22;33"分割符为";" 希望输出的结果是"11 ; 22 ; 33"
19 楼 bonny 2009-09-19  
相信随着JVM进步以及JDK的优化,采用基础的string.split写法会被不断优化,变快。

因此不是对性能非常苛刻的非常非常特殊的场合,没必要用token。

连胶水语言你都忍了,还受不了java么?如果要速度,c去。

相关推荐

Global site tag (gtag.js) - Google Analytics