为什么 StringTokenizer 在 while 循环和 for 循环中使用时给出不同的输出

Why is StringTokenizer giving different outputs when used in a while loop and a for loop

我使用 StringTokenizer 来获取字符串的标记。但是当我尝试使用 for 循环和 while 循环打印 StringTokenizer 中的所有标记时,我得到了两个不同的输出。

String string="She is an attractive girl, isn't she?";
StringTokenizer stringTokenizer=new StringTokenizer(string,",");

当我尝试使用 for 循环打印所有标记时

for (int i=0;i<stringTokenizer.countTokens();i++)
  System.out.println(stringTokenizer.nextToken());

输出

她是个很有魅力的女孩

当我尝试使用 while 循环打印所有标记时

while (stringTokenizer.hasMoreElements())
  System.out.println(stringTokenizer.nextToken());

输出

她是个很有魅力的女孩

不是吗?

我想知道为什么 while 循环给出了预期的两个标记而 for 循环没有给出这两个标记。

countTokens() 值在您调用 nextToken() 时递减。在第一个 运行 countTokens() 中,找到的两个条目返回 2。当您第一次调用 nextToken() 时,此数字会减少到 1,因为只剩下一个条目可供阅读。但这意味着 for 循环将导致

for (int i=0; i<1; i++)

并且 for 循环变量 i 已经处于值 1。因此,由于 1<1false,您的 for 循环在未读取第二个条目的情况下终止。

您可以先将标记的计数保存在一个变量中,然后在您的 for 循环中使用它。

int count = stringTokenizer.countTokens();
for (int i=0; i<count; i++) {
    System.out.println(stringTokenizer.nextToken());
}

这样,countTokens() 方法只被调用一次(使用正确的值),而不是在每次 nextToken() 调用之后,剩余令牌计数减少。