在上一篇文章当中我们介绍了java中的迭代器以及它的工作原理,那么我们在java中具体要怎样使用迭代器来遍历单例集合中的元素呢?由于java中Collection接口下有两类单例集合容器,List类和Set类,它们的底层实现方式略有不同,因此我们分开介绍迭代器在它们当中的使用。
一、迭代List接口型容器
List接口型容器作为典型的单例集合容器,它的元素特征是有序可重复。并且它的元素因为索引的原因而具有保序性,即添加顺序与元素顺序一致。我们可以通过for循环以及具有迭代器性质的增强for循环来对List接口型容器中的元素进行遍历,因此可一个将这两种遍历方式作为对比组来验证使用迭代器遍历元素的操作是否可行。
这里我们用一个例子来进行验证迭代器的使用,首先我们创建一个测试类IteratorListTest用于测试List接口型容器中迭代器的使用。在验证迭代器的使用之前去我们要先实例化一个List接口型的单例集合容器,这里可以采用List接口下的任何一个具体实现类来实例化容器,因为作为List接口型容器的具体实现类,它们都实现了迭代器。这里我们用ArrayList类来演示。
在完成了添加元素的操作之后我们通过迭代器来对容器中的元素进行遍历操作。根据上一篇文章的介绍我们知道,单例集合中会实现一个Iterator接口中的iterator方法,这个方法会返回一个Iterator接口类型的迭代器对象,因此在调用iterator方法的时候我们可以用一个Iterator类型的变量来接收iterator方法的返回值。具体使用如以下代码Iterator<String> iterator =list.iterator();所示。特别注意的是,Iterator是一个泛型接口,因此我们在接收时要给定泛型类型,这里我们给定泛型类型为String,因为这里的泛型应该与你要遍历的容器的泛型保持一致。
获取到迭代器对象之后我们就要回顾之前介绍的迭代器工作原理了,很明显我们介绍的迭代器工作原理是一个循环结构,每当hashNext反法返回一个true类型的值的时候就可以调用next方法来获取容器中的元素,直到hashNext方法返回的值为false为止。那么很明显可以将hashNext方法作为是否进入循环条件。这样我们最容易想到的循环结构就是while循环,因为它的结构容易理解。所以我们就可得到演示代码中的结构。
既然迭代器能够通过while循环来实现迭代操作,那么用其他的循环结构是否也能实现呢,答案是可以的。我们也可以通过for循环来实现迭代器的遍历操作,不过这里的for循环结构和普通的for循环结构有所不同,除了循环体外它只有两个部分,初始化语句和判断语句没有控制条件语句。初始化语句用来生成迭代器,判断语句用来判断是否执行循环。那么为什么没有控制条件语句呢?那是因为,控制条件包含在循环结构中了,理由是next方法不仅会获取元素,还会将指针移动到下一个元素的位置。
package com.container.demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("a");
list.add("c");
Iterator<String> iterator =list.iterator();
while(iterator.hasNext()){
String value = iterator.next();
System.out.print(value+"\t");
}
System.out.println();
System.out.println("_________________________________");
for (Iterator<String> it = list.iterator();it.hasNext();){
String va = it.next();
System.out.print(va+"\t");
}
}
}

二、迭代Set接口型容器
Set接口型的容器也是Collection接口下的容器类型之一,它的元素特征是无序不可重复。由于它的底层是通过Hsah算法来实现的,它的元素是没有索引这个概念的,因此正常情况之下是无法通过for循环来遍历它里面的元素的。一般情况我们通过具有迭代器性质的增强for循环来实现遍历操作。但是因为Set接口类型的容器实现了iterator方法,所以我们也可以用迭代器的方法来实现元素的遍历操作。这里的使用方法和在List接口型的容器中的使用方法是一样的,不再过多赘述。
此外,这里要说的是,在双例集合中,我们可以通过entrySet 和 keySet这两个方法来获取一个set对象。这时我们就可以通过迭代器遍历获取的set对象中的元素,从而间接遍历双例集合中的元素。
package com.container.demo;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class IteratorSetTest {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("d");
set.add("ac");
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
String value = iterator.next();
System.out.print(value+"\t");
}
System.out.println();
for (Iterator it = set.iterator();it.hasNext();) {
Object va = it.next();
System.out.print(va+"\t");
}
}
}


1935

被折叠的 条评论
为什么被折叠?



