Java文档似乎没有提及关于StringTokenizer
的弃用方面的任何内容,但我一直听说它很久以前不赞成使用。它是否被弃用,因为它有错误/错误,或者只是更好地使用整体?为什么不推荐使用StringTokenizer?
我有一些代码,使用StringTokenizer
,我想知道是否应该认真关注重构它使用String.split()
,或弃用纯粹是为了方便,而我的代码是安全的。
Java文档似乎没有提及关于StringTokenizer
的弃用方面的任何内容,但我一直听说它很久以前不赞成使用。它是否被弃用,因为它有错误/错误,或者只是更好地使用整体?为什么不推荐使用StringTokenizer?
我有一些代码,使用StringTokenizer
,我想知道是否应该认真关注重构它使用String.split()
,或弃用纯粹是为了方便,而我的代码是安全的。
从Javadoc文档StringTokenizer:
StringTokenizer
是保留兼容性的原因,虽然它的使用是在新代码气馁的遗留类。建议任何寻求此功能的人使用String或java.util.regex包的拆分方法。
如果你看看String.split()
并将其与StringTokenizer
,相关的不同之处在于String.split()
使用正则表达式,而StringTokenizer
只是使用逐字分割字符。所以如果我想用比单个字符更复杂的逻辑来标记字符串(例如在\r\n
上分割),我不能使用StringTokenizer
,但我可以使用String.split()
。
如果没有标记不会消失。
+1用于纠正常见混淆。 – Nishant
“StringTokenizer是一个遗留的类,为了兼容性的原因被保留,虽然它在新代码中的使用不受欢迎。建议任何寻求这种功能的人都使用String或java.util.regex包的拆分方法。” – Miuler
旧版与旧版不同。 – StackOverflowed
我不使得其原因是String.split方法认为,因为分裂是解析字符串缓慢的方式 - 这里面编译的模式。
的StringTokenizer只是可以用更多的功能类,如java.util.Scanner中或更换您可以使用模式匹配的正则表达式来获得团体。
的StringTokenizer不会被弃用
这是有点不同的功能和输出...
举例来说,如果你有"aaa.aa.aa"
并希望将它拆分成零件"aaa"
,"aa"
和"a"
,你可以这样写:
new StringTokenizer("aaa.aa.aa", ".")
如果只是用:
"aaa.aa.aa".split(".")
它返回一个空数组,因为它匹配正则表达式,其中.
是一个空间性格。所以,你必须要逃避它:
"aaa.aa.aa".split("\\.")
所以基本上..分裂使您可以使用正则表达式...它可以是非常有用的
但StringTokenizer的解析由标记文字...和令牌可以更特殊字符
没有与StringTokenize一个问题...
斯普利特必须使用正则表达式,StringTokenizer的使用字符串或CharSequence中,
但
"a.b..".split(".")
将返回{"a","b",""}
和StringTokenizer的 “A·B ..” ......将只返回{ “A”, “B”}
这是非常棘手!小心点!!!
到StringTokenizer的更好,更安全的替代品:
好多StrongTokenizer
是org.apache.common.lang3
...它具有更大的灵活性或
com.google.common.base.Splitter
。这个问题让我们的程序员花费巨大的努力去找到一个“蝴蝶效应”的错误。为什么Java团队一开始就发明了这样可怕的东西?......叹气! –
的StringTokenizer其实也不是过时的StringTokenizer是4X快于String.split()并且在竞争性编程中它被许多开发者使用。
来源: - Faster Input for Java
这仍然有效吗? – RBz
根据其他答案是的,这只是分割更灵活,因为你可以使用正则表达式 –
的StringTokenizer是保留兼容性的原因,虽然它的使用是在新代码气馁的遗留类。建议任何寻求此功能的人使用String或java.util.regex包的拆分方法。
下面的示例示出了String.split()方法如何可用于串分解成它的基本标记:
String[] result = "this is a test".split("\\s");
'StringTokenizer'是传统类(即有一个更好的替换出那里),但它不是**弃用。当类/方法有一些严重的缺陷时才会发生弃用。 'Vector'发生类似的情况:你几乎总是用一个'ArrayList'代替它,但它不是“坏”或“破碎的”,因此它不被弃用。 –
@Joachim如果可以接受评论我会有 – donnyton
StringTokenizer有一个严重的常识问题:它将连续的分隔符视为一个分隔符。这不是一种常见的或传统的意义。例如,在csv'a,b'中表示第二个字段的3个字段为空。但是在Stringtokenizer中,默认情况下只能看到2个字段,',,'被视为','。这已经让很多程序员感到困惑,并让他们体验到不必要的调试工作。 ***只是不要使用它任何地方*** –