Java文档似乎没有提及有关StringTokenizer
的弃用的任何内容,但我一直听说它很久以前就被弃用了。它是否已被弃用,因为它有错误/错误,或String.split()
只是更好地使用整体?
我有一些使用StringTokenizer
的代码,我想知道是否应该认真考虑重构它以使用String.split()
,或者弃用是否仅仅是为了方便我的代码是安全的
答案 0 :(得分:82)
如果它没有被标记为已弃用,则不会消失。
答案 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)
不推荐使用StringTokenizer
功能与输出差别不大......
例如,如果您有"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年代早期变得非常普遍,因此几乎没用。