我刚刚了解了 Java 的 Scanner 类,现在我想知道它如何与 StringTokenizer 和 String.Split 进行比较/竞争。我知道 StringTokenizer 和 String.Split 仅适用于字符串,那么我为什么要对字符串使用扫描仪? Scanner 是否只是为了提供拆分的一站式服务?
原文由 Dave 发布,翻译遵循 CC BY-SA 4.0 许可协议
我刚刚了解了 Java 的 Scanner 类,现在我想知道它如何与 StringTokenizer 和 String.Split 进行比较/竞争。我知道 StringTokenizer 和 String.Split 仅适用于字符串,那么我为什么要对字符串使用扫描仪? Scanner 是否只是为了提供拆分的一站式服务?
原文由 Dave 发布,翻译遵循 CC BY-SA 4.0 许可协议
让我们从消除 StringTokenizer
开始。它变老了,甚至不支持正则表达式。它的文档指出:
StringTokenizer
是出于兼容性原因保留的遗留类,尽管不鼓励在新代码中使用它。建议任何寻求此功能的人使用split
方法String
或java.util.regex
包。
所以让我们马上把它扔掉。 split()
和 Scanner
。它们之间有什么区别?
一方面, split()
只是返回一个数组,这使得使用 foreach 循环变得容易:
for (String token : input.split("\\s+") { ... }
Scanner
更像是一个流:
while (myScanner.hasNext()) {
String token = myScanner.next();
...
}
或者
while (myScanner.hasNextDouble()) {
double token = myScanner.nextDouble();
...
}
(它有一个相当 大的 API ,所以不要认为它总是局限于这么简单的事情。)
当您在开始解析之前没有(或无法获得)所有输入时,这种流式接口可用于解析简单的文本文件或控制台输入。
就个人而言,我记得唯一一次使用 Scanner
是为了学校项目,当时我不得不从命令行获取用户输入。它使这种操作变得容易。但是,如果我有一个 String
我想拆分,那么使用 split()
几乎是轻而易举的事。
原文由 Michael Myers 发布,翻译遵循 CC BY-SA 2.5 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
它们本质上是用于训练的马。
Scanner
专为需要解析字符串、提取不同类型数据的情况而设计。它非常灵活,但可以说并没有为您提供最简单的 API,用于简单地获取由特定表达式分隔的字符串数组。String.split()
和Pattern.split()
为您提供了执行后者的简单语法,但这基本上就是它们所做的全部。如果您想解析结果字符串,或根据特定标记在中途更改定界符,他们不会帮助您。StringTokenizer
比String.split()
更严格,而且使用起来也有点麻烦。它本质上是为提取由固定子字符串分隔的标记而设计的。由于此限制,它的速度大约是String.split()
的两倍。 (参见我 对String.split()
和StringTokenizer
的比较。)它也早于正则表达式 API,其中String.split()
是其中的一部分。您会从我的计时中注意到
String.split()
仍然可以在典型机器上 几毫秒内标记数千个字符串。此外,它比StringTokenizer
更有优势,它以字符串数组的形式为您提供输出,这通常是您想要的。使用由Enumeration
提供的StringTokenizer
在大多数情况下过于“语法繁琐”。从这个角度来看,StringTokenizer
现在有点浪费空间,你还不如使用String.split()
。