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().