扫描仪与 StringTokenizer 与 String.Split

新手上路,请多包涵

我刚刚了解了 Java 的 Scanner 类,现在我想知道它如何与 StringTokenizer 和 String.Split 进行比较/竞争。我知道 StringTokenizer 和 String.Split 仅适用于字符串,那么我为什么要对字符串使用扫描仪? Scanner 是否只是为了提供拆分的一站式服务?

原文由 Dave 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 678
2 个回答

它们本质上是用于训练的马。

  • Scanner 专为需要解析字符串、提取不同类型数据的情况而设计。它非常灵活,但可以说并没有为您提供最简单的 API,用于简单地获取由特定表达式分隔的字符串数组。
  • String.split()Pattern.split() 为您提供了执行后者的简单语法,但这基本上就是它们所做的全部。如果您想解析结果字符串,或根据特定标记在中途更改定界符,他们不会帮助您。
  • StringTokenizerString.split() 更严格,而且使用起来也有点麻烦。它本质上是为提取由固定子字符串分隔的标记而设计的。由于此限制,它的速度大约是 String.split() 的两倍。 (参见我 String.split()StringTokenizer 的比较。)它也早于正则表达式 API,其中 String.split() 是其中的一部分。

您会从我的计时中注意到 String.split() 仍然可以在典型机器上 几毫秒内标记数千个字符串。此外,它比 StringTokenizer 更有优势,它以字符串数组的形式为您提供输出,这通常是您想要的。使用由 Enumeration 提供的 StringTokenizer 在大多数情况下过于“语法繁琐”。从这个角度来看, StringTokenizer 现在有点浪费空间,你还不如使用 String.split()

原文由 Neil Coffey 发布,翻译遵循 CC BY-SA 3.0 许可协议

让我们从消除 StringTokenizer 开始。它变老了,甚至不支持正则表达式。它的文档指出:

StringTokenizer 是出于兼容性原因保留的遗留类,尽管不鼓励在新代码中使用它。建议任何寻求此功能的人使用 split 方法 Stringjava.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题