2011-08-08 61 views
44

Java文档似乎没有提及关于StringTokenizer的弃用方面的任何内容,但我一直听说它很久以前不赞成使用。它是否被弃用,因为它有错误/错误,或者只是更好地使用整体?为什么不推荐使用StringTokenizer?

我有一些代码,使用StringTokenizer,我想知道是否应该认真关注重构它使用String.split(),或弃用纯粹是为了方便,而我的代码是安全的。

+33

'StringTokenizer'是传统类(即有一个更好的替换出那里),但它不是**弃用。当类/方法有一些严重的缺陷时才会发生弃用。 'Vector'发生类似的情况:你几乎总是用一个'ArrayList'代替它,但它不是“坏”或“破碎的”,因此它不被弃用。 –

+5

@Joachim如果可以接受评论我会有 – donnyton

+2

StringTokenizer有一个严重的常识问题:它将连续的分隔符视为一个分隔符。这不是一种常见的或传统的意义。例如,在csv'a,b'中表示第二个字段的3个字段为空。但是在Stringtokenizer中,默认情况下只能看到2个字段,',,'被视为','。这已经让很多程序员感到困惑,并让他们体验到不必要的调试工作。 ***只是不要使用它任何地方*** –

回答

60

从Javadoc文档StringTokenizer

StringTokenizer是保留兼容性的原因,虽然它的使用是在新代码气馁的遗留类。建议任何寻求此功能的人使用String或java.util.regex包的拆分方法。

如果你看看String.split()并将其与StringTokenizer,相关的不同之处在于String.split()使用正则表达式,而StringTokenizer只是使用逐字分割字符。所以如果我想用比单个字符更复杂的逻辑来标记字符串(例如在\r\n上分割),我不能使用StringTokenizer,但我可以使用String.split()

76
  1. Java 8 String Tokenizer - 不会被弃用
  2. Java 7 String Tokenizer - 不会被弃用
  3. Java 6 String Tokenizer - 不会被弃用
  4. Java 5 String Tokenizer - 为过时,它不会被弃用

如果没有标记不会消失。

+8

+1用于纠正常见混淆。 – Nishant

+7

“StringTokenizer是一个遗留的类,为了兼容性的原因被保留,虽然它在新代码中的使用不受欢迎。建议任何寻求这种功能的人都使用String或java.util.regex包的拆分方法。” – Miuler

+5

旧版与旧版不同。 – StackOverflowed

-1

就我个人而言,我觉得StringTokenizer已被弃用,因为它只是一种非常简单的复杂方法。 StringTokenizer顾名思义只适用于字符串,所以为什么不在String中使它成为方法。而且StringTokenizer的不支持正则表达式不支持正则表达式,在90年代后期和早00的,因此使得它几乎无用变得非常普遍。

+12

它不被弃用。 – Nishant

+1

你说得对,不是,只是建议你不要使用它。不同之处在于,在将来的版本中将不会继续提供已弃用的类的保证。 – Ali

+4

这也不正确。对向后的二进制兼容性有绝对的保证。确切地说, – EJP

0

我不使得其原因是String.split方法认为,因为分裂是解析字符串缓慢的方式 - 这里面编译的模式。

的StringTokenizer只是可以用更多的功能类,如java.util.Scanner中或更换您可以使用模式匹配的正则表达式来获得团体。

0
  1. 的StringTokenizer不会被弃用

  2. 这是有点不同的功能和输出...

举例来说,如果你有"aaa.aa.aa"并希望将它拆分成零件"aaa""aa""a",你可以这样写:

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

如果只是用:

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

它返回一个空数组,因为它匹配正则表达式,其中.是一个空间性格。所以,你必须要逃避它:

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

所以基本上..分裂使您可以使用正则表达式...它可以是非常有用的

但StringTokenizer的解析由标记文字...和令牌可以更特殊字符

2

没有与StringTokenize一个问题...

斯普利特必须使用正则表达式,StringTokenizer的使用字符串或CharSequence中,

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

和StringTokenizer的 “A·B ..” ......将只返回{ “A”, “B”}

这是非常棘手!小心点!!!

到StringTokenizer的更好,更安全的替代品:

好多StrongTokenizerorg.apache.common.lang3 ...它具有更大的灵活性或

com.google.common.base.Splitter

+0

。这个问题让我们的程序员花费巨大的努力去找到一个“蝴蝶效应”的错误。为什么Java团队一开始就发明了这样可怕的东西?......叹气! –

11

的StringTokenizer其实也不是过时的StringTokenizer是4X快于String.split()并且在竞争性编程中它被许多开发者使用。

来源: - Faster Input for Java

+0

这仍然有效吗? – RBz

+0

根据其他答案是的,这只是分割更灵活,因为你可以使用正则表达式 –

0

的StringTokenizer是保留兼容性的原因,虽然它的使用是在新代码气馁的遗留类。建议任何寻求此功能的人使用String或java.util.regex包的拆分方法。

下面的示例示出了String.split()方法如何可用于串分解成它的基本标记:

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