代码之家  ›  专栏  ›  技术社区  ›  Nambi_0915

为什么要使迭代器为空?

  •  6
  • Nambi_0915  · 技术社区  · 8 年前
    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 .所以我看了迭代器的代码.size()函数。

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

    所以我怀疑迭代器 keys 变空了。是否通过引用调用?

    有人能解释一下在size()函数中发生了什么吗?

    1 回复  |  直到 8 年前
        1
  •  15
  •   Andy Turner    8 年前
    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()));    
    

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