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

时间:2018-09-18 12:49:47

标签: 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));
}

在此代码中,执行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);
}

因此,我对迭代器keys如何为空感到怀疑。是否被引用调用?

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

1 个答案:

答案 0 :(得分:15)

System.err.println(Iterators.size(keys));

As it says in the Javadoc,这将耗尽keys迭代器:它只会不断调用next()直到hasNext()为假。

那么在您致电之前不会重置

System.err.println(Iterators.size(keys));
再次

(因为无法重置迭代器)。因此hasNext()立即返回false,因此不再需要读取其他元素。因此大小为零。

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

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

keys = json.keys();  //

System.err.println(Iterators.size(keys));

或不声明变量(因为之后实际上(*)没用):

System.err.println(Iterators.size(json.keys()));
System.err.println(Iterators.size(json.keys()));    

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