Java HashSet的奇怪迭代器行为

use*_*001 4 java iterator hashset

今天我用HashSet的迭代器遇到了一些奇怪的行为.在下面的代码示例中,idString使用返回的对象引用hs.iterator来调用迭代器的next()方法.

idString2迭代器中调用via hs.iterator(),它不再起作用.

所以我假设HashSet.iterator()每次调用时都会返回一个新的迭代器对象.但是,为什么我仍然可以hs.iterator().hasNext()在while循环中使用?

(注意下面的代码只是一个例子:))

import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;

import org.junit.Test;

public class DummyTest {
  static final HashSet<Integer> TEST_DATA = new HashSet<Integer>(
    Arrays.asList(new Integer[] {
      1,2,3,4,5,6,7,8,9,10
    }));

  @Test
  public void testRunTest() {
    // Correct output: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    System.out.println(idString(TEST_DATA));
    // Only 1, 1, 1, 1, ...
    System.out.println(idString2(TEST_DATA));
  }

  static String idString(HashSet<Integer> hs) {
    Iterator<Integer> it = hs.iterator();
    String res = it.next() + "";
    while (it.hasNext()) {
      res += ", " + it.next();
      System.out.println(res); // debug
    }
    return res;
  }


  static String idString2(HashSet<Integer> hs) {
    Iterator<Integer> it = hs.iterator();
    // Prevent an infinite loop
    int i = 0;
    String res = null;
    res = it.next() + "";
    while (hs.iterator().hasNext() && i++ <= 10) {
      // if replacing hs.iterator() with 'it', it works
      res = res + ", " + hs.iterator().next();
      System.out.println(res); // debug
    }
    return res;
  }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 12

每次调用iterator()它都会返回一个新的迭代器,独立于之前创建的任何其他迭代器.因此,如果您调用hs.iterator().next()它将始终为您提供第一个元素,并且如果您调用hs.iterator().hasNext()非空集合,它将始终返回true.

比较it每次使用单个迭代器的时间,因此每次调用时都会提升逻辑"光标" next().