Scanner vs. StringTokenizer vs. String.Split

2022-08-31 07:06:47

我刚刚了解了Java的Snersner类,现在我想知道它如何与StringTokenizer和String.Split进行比较/竞争。我知道 StringTokenizer 和 String.Split 只适用于 Strings,那么我为什么要对 String 使用 Scanner 呢?Scanner 只是为了一站式购物进行拆分吗?


答案 1

他们本质上是课程的马。

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

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


答案 2

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

StringTokenizer是出于兼容性原因而保留的旧类,尽管不鼓励在新代码中使用它。建议任何寻求此功能的人改用 或 包 的方法。splitStringjava.util.regex

所以让我们马上把它扔掉。这留下了 split()Scanner。它们之间有什么区别?

首先,只需返回一个数组,这使得使用 foreach 循环变得容易:split()

for (String token : input.split("\\s+") { ... }

Scanner构建得更像一个流:

while (myScanner.hasNext()) {
    String token = myScanner.next();
    ...
}

while (myScanner.hasNextDouble()) {
    double token = myScanner.nextDouble();
    ...
}

(它有一个相当大的API,所以不要以为它总是局限于如此简单的事情。

此流样式界面可用于分析简单的文本文件或控制台输入,前提是在开始分析之前没有(或无法获得)所有输入。

就个人而言,我记得唯一一次使用是用于学校项目,当时我必须从命令行获取用户输入。它使这种操作变得容易。但是,如果我有一个我想分开的东西,那么几乎是一个明智的选择。ScannerStringsplit()