为什么Iterators.size()使迭代器变空?

Nam*_*915 6 java iterator guava

public static void main(String args[]) throws JSONException {
    JSONObject json = new JSONObject();
    json.put("name", "abcgdj");
    json.put("no", "1234");
    json.put("contact", "6748356");
    Iterator<?> keys = json.keys();
    System.err.println(Iterators.size(keys));
    System.err.println(Iterators.size(keys));
}
Run Code Online (Sandbox Code Playgroud)

在此代码中,执行后Iterators.size(keys),迭代器变为空,对于第二个print语句,它返回0.

size()方法在包下com.google.common.collect.iterators.所以我看了Iterators.size()函数的代码.它是,

 public static int size(Iterator<?> iterator) {
    long count = 0L;
    while (iterator.hasNext()) {
    iterator.next();
    count++;
  }
  return Ints.saturatedCast(count);
}
Run Code Online (Sandbox Code Playgroud)

所以我怀疑迭代器是如何keys变空的.是否通过引用调用?

任何人都可以解释size()函数内发生的事情

And*_*ner 15

System.err.println(Iterators.size(keys));
Run Code Online (Sandbox Code Playgroud)

正如它在Javadoc中所说的那样,它耗尽了keys迭代器:它只是一直调用next()直到hasNext()错误.

然后在你打电话之前没有重置

System.err.println(Iterators.size(keys));
Run Code Online (Sandbox Code Playgroud)

再次(因为没有办法重置迭代器).所以hasNext()立即返回false,因此没有更多元素可供阅读.因此,大小为零.

您需要使用新的迭代器重新分配变量:

Iterator<?> keys = json.keys();
System.err.println(Iterators.size(keys));

keys = json.keys();  //

System.err.println(Iterators.size(keys));
Run Code Online (Sandbox Code Playgroud)

或者不声明变量(因为之后它实际上是无效的(*)):

System.err.println(Iterators.size(json.keys()));
System.err.println(Iterators.size(json.keys()));    
Run Code Online (Sandbox Code Playgroud)

(*)您可以使用它来删除迭代器的最后一个元素.