我正在浏览以下代码示例:
public class GenericTest {
public static void main (String[] args) {
ArrayList<String> myList = new ArrayList<String>();
String s1 = "one";
String s2 = "two";
String s3 = "three";
myList.add(s1); myList.add(s2); myList.add(s3);
String st;
Iterator<String> itr = myList.iterator();
while (itr.hasNext()) {
st = itr.next();
System.out.println(st);
}
}
}
我想知道使用Iterator接口的实现而不是使用普通的for-each循环有什么好处?
for ( String str : myList ) {
System.out.println(str);
}
如果这个例子不相关,那么当我们应该使用Iterator时会有什么好处?
谢谢。
答案 0 :(得分:22)
基本上,foreach循环是迭代器最常用的快捷方式。这是迭代所有元素。但是存在一些差异:
答案 1 :(得分:11)
For-Each循环是在Java 5中引入的,所以它不是那么“旧”。
如果你只想迭代一个集合,你应该使用for each循环
for (String str : myList) {
System.out.println(str);
}
但有时候,“普通旧”迭代器的hasNext()
方法对于检查迭代器是否有更多元素非常有用。
for (Iterator<String> it = myList.iterator(); it.hasNext(); ) {
String str = it.next();
System.out.print(str);
if (it.hasNext()) {
System.out.print(";");
}
}
您还可以调用it.remove()
来删除下一个返回的最新元素。
还有ListIterator<E>
提供双向遍历it.next()
和it.previous()
。
所以,它们并不等同。两者都是必需的。
答案 2 :(得分:2)
for ( String str : myList ) { System.out.println(str); }
此代码实际上将使用myList.Iterator对列表进行迭代。
从java 5开始添加新的for
循环,以便更轻松地对集合和数组进行迭代。
通过Iterator Java Collection中的每个实现都可以有自己的迭代方式(List,Set,LinkedList,Map或....)
您也可以在自定义类中实现此接口。让其他代码迭代你对象中的元素。
答案 3 :(得分:2)
我不认为在大多数情况下使用任何一个性能优势,如果你只是迭代集合/数组。但根据您的使用情况,使用情况可能会有所不同。
答案 4 :(得分:1)
迭代器是对集合实现方式的抽象。它允许您一次遍历整个集合一个项目,可选择删除项目。
Iterator的缺点是,如果您知道底层实现,它可能会很慢。例如,对于ArrayList使用Iterator比为每个元素调用ArrayList.get(i)要慢得多。这是否重要取决于代码的作用。
答案 5 :(得分:0)
这两者在操作和性能方面几乎在所有情况下均相同。唯一的区别是旧版本的Java JVM支持迭代器,而新的“for”语法仅在JSDK 1.5(“Java 5”)中引入,有些人希望保持与1.4或更早版本兼容。
答案 6 :(得分:0)
为了能够在迭代时安全地从集合中移除元素并避免 DO
$do$
BEGIN
IF EXISTS (SELECT FROM pg_catalog.pg_tables
WHERE schemaname = 'myschema'
AND tablename = 'mytable') THEN
RAISE NOTICE 'Table myschema.mytable already created.';
ELSE
CREATE TABLE myschema.mytable (i integer); -- your table definition here
END IF;
END
$do$;
以防您在迭代时需要从循环中移除元素