`
kaka2008
  • 浏览: 93607 次
  • 性别: 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去。

相关推荐

    c#模拟实现java StringTokenizer

    在这个问题中,我们关注的是如何在 C# 中模拟实现 Java 的 `StringTokenizer` 类的功能。Java 的 `StringTokenizer` 类是一个用于分隔字符串的工具,它可以根据特定的分隔符将一个大的字符串拆分成多个小的字符串或...

    StringTokenizer的使用

    import java.util.StringTokenizer; /** * * @author lushuaiyin * */ public class StringTokenizerTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated...

    StringTokenizer的用法

    ### StringTokenizer的用法 在Java编程语言中,`StringTokenizer`是`java.util`包中的一个实用类,用于将字符串分割成多个子字符串(通常称为令牌或token)。它支持多种分隔符,并允许用户控制是否返回分隔符作为...

    StringTokenizer(delphi版)

    用delphi实现java的StringTokenizer类的功能。在原来曾青松版本的基础上修复bug完成的。

    java stringtokenizer

    StringTokenizer tool class

    基于Java中的StringTokenizer类详解(推荐)

    基于Java中的StringTokenizer类详解 Java中的StringTokenizer类是一个非常有用的工具类,用于字符串的分隔解析。它属于Java.util包。通过使用StringTokenizer类,我们可以轻松地将一个字符串分隔成多个子字符串,以...

    Java 实例 - 字符串分隔(StringTokenizer)源代码-详细教程.zip

    在Java编程语言中,`StringTokenizer`类是一个非常实用的工具,它用于将字符串分割成多个子字符串。这个工具在处理包含多个分隔符的复杂数据时尤其有用。本详细教程将深入探讨`StringTokenizer`的工作原理、用法以及...

    测试StringTokenizer

    本段代码 用于测试StringTokenizer用法/** * 测试StringTokenizer,继承Enumeration; * @author DELL */

    JAVA StringBuffer类与StringTokenizer类代码解析

    JAVA StringBuffer类与StringTokenizer类代码解析 JAVA StringBuffer类是Java语言中的一种字符串处理类,提供了一个字符串的可变序列,类似于String类,但它对存储的字符序列可以任意修改,使用起来比String类灵活...

    java实验4.2(StringTokenizer1.java)

    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 ...

    StringTokenizer1---马克-to-win java视频

    StringTokenizer 马克-to-win java视频 字符串解析器

    StringTokenizer2---马克-to-win java视频

    StringTokenizer 马克-to-win java视频 字符串解析器

    Java编写一个程序,输入一行文本,采用StringTokenizer类的对象,将文本符号化,并以逆序输出语言符号。

    StringTokenizer tokens = new StringTokenizer(input, " "); while (tokens.hasMoreTokens()) { String token = tokens.nextToken(); // 处理每个标记 } ``` ### 2. 输入输出处理 在Java中,`JOptionPane`类...

    Java-StringTokenizer1

    Java中的`StringTokenizer`类是处理字符串的一种工具,它允许我们根据特定的分隔符将一个字符串分解成多个令牌或子字符串。这个类在早期的Java版本中被广泛使用,但在Java 5之后,`split()`方法的引入使得`...

    java文档String和StringTokenizer---马克-to-win java视频

    java文档String和StringTokenizer 马克-to-win java视频 字符串解析器

    java常用类的使用方法

    本文将深入探讨几个核心类:Integer、Float、Double、Character、String、StringTokenizer、StringBuffer以及Random,解析它们的功能与应用场景,帮助开发者更好地利用这些类来解决实际问题。 ### Integer类 `...

    java字符串分隔类

    ### Java字符串分隔类——StringTokenizer的使用方法详解 在Java编程中,处理字符串是非常常见的需求之一,特别是在数据解析、格式化输出等场景下。`StringTokenizer`类作为Java标准库的一部分,为开发者提供了一种...

    Arduino-StringTokenizer-Library:一个非常简单的arduino库,可以使用Java(如string-tokenizer函数)使用定界符分割字符串

    Arduino-StringTokenizer-库一个非常简单的arduino库,可以使用Java(如string-tokenizer函数)来使用定界符分割字符串。 基本说明: 参数:用于标记化的字符串; 分隔符字符串职能 : (boolean)hasNext()-如果...

    fgsfgfgttst

    根据提供的文件信息,可以看出这是一段Java代码,主要涉及了`StringTokenizer`类的应用以及`Hashtable`类的使用。下面将对这段代码所涉及的知识点进行详细的解释。 ### 使用到的关键知识点 #### 1. `...

    jsp留言版-application

    - 使用`StringTokenizer`解析用户输入,例如,如果用户名和留言内容由逗号分隔,可以创建一个`StringTokenizer`实例来分割字符串。 - 将解析出的字段通过`application.setAttribute()`存储到`application`对象中。...

Global site tag (gtag.js) - Google Analytics