使用迭代器访问 Java 集合
原文:https://www.studytonight.com/java/iterator-in-collection.php
要访问集合的元素,如果集合是基于列表的,我们可以使用索引,或者我们需要遍历元素。有三种可能的方式遍历任何集合的元素。
- 使用迭代器接口
- 使用列表迭代器接口
- 使用 for-each 循环
使用迭代器访问元素
迭代器是用于迭代集合元素的接口。它是 java 集合框架的一部分。它提供了一些用于检查和访问集合元素的方法。
迭代器接口用于向前遍历列表,使您能够移除或修改集合的元素。每个集合类都提供iterator()
方法来返回一个迭代器。
迭代器接口方法
| 方法 | 描述 |
| 布尔值 hasNext()
| 如果集合中有更多的元素,则返回 true 。否则,返回 false。 |
| E next()
| 返回集合中出现的下一个元素。如果没有下一个元素,将引发 NoSuchElementException。 |
| 作废remove()
| 移除当前元素。如果试图调用前面没有调用next()
方法的 remove()方法,将引发 IllegalStateException。 |
迭代器示例
在这个例子中,我们使用的是集合接口的 iterator()方法,该方法返回 Iterator 接口的一个实例。之后我们使用 hasNext()方法,返回 true 集合包含一个元素,在循环中,通过调用next()
方法获取每个元素。
import java.util.*;
class Demo
{
public static void main(String[] args)
{
ArrayList< String> ar = new ArrayList< String>();
ar.add("ab");
ar.add("bc");
ar.add("cd");
ar.add("de");
Iterator it = ar.iterator(); //Declaring Iterator
while(it.hasNext())
{
System.out.print(it.next()+" ");
}
}
}
ab bc cd de
使用ListIterator
访问元素
ListIterator
接口用于在向前和向后两个方向遍历列表。它只适用于那些实现列表界面的集合。
列表迭代器的方法:
| 方法 | 描述 |
| 作废add(E obj)
| 将 obj 插入下一次调用 next()方法将返回的元素前面的列表中。 |
| 布尔值 hasNext()
| 如果有下一个元素,则返回 true。否则,返回 false。 |
| 布尔值 hasPrevious()
| 如果有前一个元素,则返回 true。否则,返回 false。 |
| E next()
| 返回下一个元素。如果没有下一个元素,将引发 NoSuchElementException。 |
| int nextIndex()
| 返回下一个元素的索引。如果没有下一个元素,则返回列表的大小。 |
| E previous()
| 返回前一个元素。如果没有前一个元素,将引发 NoSuchElementException。 |
| int previousIndex()
| 返回前一个元素的索引。如果没有上一个元素,则返回-1。 |
| 作废remove()
| 从列表中移除当前元素。如果在调用 next()或 previous()方法之前调用 remove()方法,将引发 IllegalStateException。 |
| 作废set(E obj)
| 将 obj 分配给当前元素。这是调用 next()或 previous()方法最后返回的元素。 |
列表迭代器示例
让我们创建一个遍历ArrayList
元素的例子。列表迭代器仅适用于列表集合。
import java.util.*;
class Demo
{
public static void main(String[] args)
{
ArrayList< String> ar = new ArrayList< String>();
ar.add("ab");
ar.add("bc");
ar.add("cd");
ar.add("de");
ListIterator litr = ar.listIterator();
while(litr.hasNext()) //In forward direction
{
System.out.print(litr.next()+" ");
}
while(litr.hasPrevious()) //In backward direction
{
System.out.print(litr.previous()+" ");
}
}
}
ab bc cd de de cd bc ab
loop 每个循环
for-each
版本的for
循环也可以用于遍历集合的元素。但这只能在我们不想修改收藏的内容,也不想任何反向访问时使用。for-each
循环可以循环通过任何实现Iterable
接口的对象集合。
Exmaple(前枫树镇):
import java.util.*;
class Demo
{
public static void main(String[] args)
{
LinkedList< String> ls = new LinkedList< String>();
ls.add("a");
ls.add("b");
ls.add("c");
ls.add("d");
for(String str : ls)
{
System.out.print(str+" ");
}
}
}
a b c d
使用 for 循环遍历
我们可以使用 for 循环遍历集合元素,但只能访问基于索引的集合。例如,list 是基于索引的集合,允许使用索引值访问其元素。
import java.util.*;
class Demo
{
public static void main(String[] args)
{
LinkedList<String> ls = new LinkedList<String>();
ls.add("a");
ls.add("b");
ls.add("c");
ls.add("d");
for(int i = 0; i<ls.size(); i++)
{
System.out.print(ls.get(i)+" ");
}
}
}
a b c d