为什么不赞成使用StringTokenizer?

时间:2011-08-08 14:44:20

标签: java string split deprecated stringtokenizer

Java文档似乎没有提及有关StringTokenizer的弃用的任何内容,但我一直听说它很久以前就被弃用了。它是否已被弃用,因为它有错误/错误,或String.split()只是更好地使用整体?

我有一些使用StringTokenizer的代码,我想知道是否应该认真考虑重构它以使用String.split(),或者弃用是否仅仅是为了方便我的代码是安全的

8 个答案:

答案 0 :(得分:82)

  1. Java 10 String Tokenizer - 未弃用
  2. Java 9 String Tokenizer - 未弃用
  3. Java 8 String Tokenizer - 未弃用
  4. Java 7 String Tokenizer - 未弃用
  5. Java 6 String Tokenizer - 未弃用
  6. Java 5 String Tokenizer - 未弃用
  7. 如果它没有被标记为已弃用,则不会消失。

答案 1 :(得分:63)

来自StringTokenizer的javadoc:

  

StringTokenizer是一个遗留类,出于兼容性原因而保留,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人都使用String的split方法或java.util.regex包。

如果您查看String.split()并将其与StringTokenizer进行比较,则相关区别在于String.split()使用正则表达式,而StringTokenizer只使用逐字拆分字符。因此,如果我想要使用比单个字符更复杂的逻辑来标记字符串(例如,在\r\n上拆分),我就无法使用StringTokenizer但我可以使用String.split()

答案 2 :(得分:13)

StringTokenizer实际上并未弃用 StringTokenizer比String.split()快4倍,而在竞争性编程中,它被许多开发人员使用。

来源: - Faster Input for Java

答案 3 :(得分:1)

StringTokenize存在问题......

Split必须使用正则表达式,StringTokenizer使用String或CharSequence,

"a.b..".split(".")将返回{"a","b",""}

和" a.b .."的StringTokenizer ...将仅返回{" a"," b"}

这非常棘手!小心!!!

更好更安全的StringTokenizer替代品是:

更好StrongTokenizer位于org.apache.common.lang3 ...它具有更大的灵活性或

com.google.common.base.Splitter

答案 4 :(得分:0)

我不这么认为原因是String.split方法,因为split是解析字符串的慢速方法 - 它在里面编译一个模式。

StringTokenizer可以替换为更多功能类,如java.util.Scanner,也可以使用模式匹配器通过regexp获取组。

答案 5 :(得分:0)

  1. 不推荐使用StringTokenizer

  2. 功能与输出差别不大......

  3. 例如,如果您有"aaa.aa.aa"并希望将其拆分为"aaa""aa""a"部分,则可以写下:

    new StringTokenizer("aaa.aa.aa", ".")
    

    如果您只是使用:

    "aaa.aa.aa".split(".")
    

    它返回空数组,因为它匹配.是空格字符的正则表达式。所以你必须逃脱它:

    "aaa.aa.aa".split("\\.")
    

    所以基本上.. split可以让你使用正则表达式...它可以是非常有用的

    但是StringTokenizer通过令牌来解析文本......令牌甚至可以是特殊字符

答案 6 :(得分:0)

StringTokenizer是一个遗留类,出于兼容性原因而保留,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人都使用String的split方法或java.util.regex包。

以下示例显示了String.split()方法如何用于将字符串拆分为其基本标记:

 String[] result = "this is a test".split("\\s");

答案 7 :(得分:-1)

我个人认为StringTokenizer已被弃用,因为它只是一种非常简单的复杂方式。 StringTokenizer顾名思义只适用于Strings,所以为什么不在String中使它成为一个方法。进一步的StringTokenizer不支持RegularExpression不支持正则表达式,这种表达式在90年代末期和00年代早期变得非常普遍,因此几乎没用。