Java 文档似乎没有提及关于弃用 for 的任何内容StringTokenizer
,但我一直听说它在很久以前是如何被弃用的。是因为它有错误/错误而被弃用,还是String.split()
整体上更好用?
我有一些使用的代码,StringTokenizer
我想知道我是否应该认真考虑重构它以使用String.split()
,或者弃用是否纯粹是为了方便而我的代码是安全的。
Java 文档似乎没有提及关于弃用 for 的任何内容StringTokenizer
,但我一直听说它在很久以前是如何被弃用的。是因为它有错误/错误而被弃用,还是String.split()
整体上更好用?
我有一些使用的代码,StringTokenizer
我想知道我是否应该认真考虑重构它以使用String.split()
,或者弃用是否纯粹是为了方便而我的代码是安全的。
如果它没有被标记为已弃用,它就不会消失。
来自StringTokenizer的javadoc :
StringTokenizer
是一个遗留类,出于兼容性原因保留,但不鼓励在新代码中使用它。建议任何寻求此功能的人改用 String 的 split 方法或 java.util.regex 包。
如果您查看String.split()
并将其与 进行比较StringTokenizer
,则相关区别在于String.split()
使用正则表达式,而StringTokenizer
仅使用逐字拆分字符。因此,如果我想用比单个字符更复杂的逻辑来标记一个字符串(例如 split on \r\n
),我不能使用StringTokenizer
,但我可以使用String.split()
.
StringTokenizer 并没有被弃用,事实上StringTokenizer 比 String.split() 快 4 倍,并且在竞争性编程中它被许多开发人员使用。
来源:-更快的 Java 输入
StringTokenize 存在问题...
拆分必须使用正则表达式,StringTokenizer 使用的是 String 或 CharSequence,
但
"a.b..".split(".")
将返回{"a","b",""}
和“ab”的 StringTokenizer。... 将只返回 {"a","b"}
这非常棘手!小心点!!!
StringTokenizer 更好、更安全的替代方案是:
更好StrongTokenizer
的是org.apache.common.lang3
......它有更多的灵活性或
com.google.common.base.Splitter
我不认为这是 String.split 方法的原因,因为 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("\\.")
所以基本上.. split 使您能够使用正则表达式...它可能非常有用
但是 StringTokenizer 通过标记解析文本......并且标记甚至可以是特殊字符
StringTokenizer 是一个遗留类,出于兼容性原因保留,但不鼓励在新代码中使用它。建议任何寻求此功能的人改用 String 的 split 方法或 java.util.regex 包。
以下示例显示了如何使用 String.split() 方法将字符串分解为其基本标记:
String[] result = "this is a test".split("\\s");
就我个人而言,我觉得 StringTokenizer 已被弃用,因为它只是一种非常简单的复杂方式。顾名思义,StringTokenizer 仅适用于字符串,所以为什么不直接将其作为字符串中的方法。此外,StringTokenizer 不支持 RegularExpression 不支持正则表达式,这在 90 年代末和 00 年代初期变得极为普遍,因此使其实际上毫无用处。