今天我在使用 HashSet 的迭代器时遇到了一些奇怪的行为。在下面的代码示例中,idString
使用返回的对象引用hs.iterator
来调用迭代器的next()
方法。
在idString2
迭代器中通过调用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;
}
}