集合的标准输出中提供了四种常见的输出方式:
Iterator:迭代输出,使用最多的输出方式;
ListIterator:Iterator的子接口,专门用于输出List中的内容;
Enumeration:旧的接口,功能与Iterator类似;
foreach:可以输出数组或集合。
1、Iterator 迭代输出
所谓迭代输出就是将元素一个个进行判断,判断其是否有内容,如果有内容则把内容取出。
Iterator接口在使用时需要指定泛型,此处指定的泛型要与集合中的类型一致。
实例化Iterator接口:Iterator<集合的泛型类型> iter = 集合的实例.iterator();
(1)输出Collection中的全部内容
Iterator接口可以直接使用Collection接口中定义的Iterator()方法为其实例化,所以List和Set子接口中也可以使用Iterator接口输出。
hasNext()方法返回Boolean类型:是否有下一个
next()方法返回的是集合泛型指定的类型:取内容
public class IteratorDemo01 {
/**
*Iterator接口,迭代输出Collection中的全部内容
*/
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Hello");
list.add("_");
list.add("world");
System.out.println("集合内容:"+list);
Iterator<String> iter = list.iterator();
System.out.print("内容输出:");
while(iter.hasNext()){
System.out.print(iter.next()+"、");
}
}
}
输出结果:
集合内容:[Hello, _, world]
内容输出:Hello、_、world、
(2)输出Map的全部内容
对于Map接口不能直接使用迭代输出(Iterator、foreach),因为Map接口的每个位置存放的是一对值(key--->value),而Iterator中每次只能找到一个值。
要用Iterator就需要把Map--------->Set接口的对象,迭代出的每个内容都是Map.Entry对象,具体步骤:
a、Map接口实例通过entrySet()方法变为Set接口对象;
b、通过Set的实例为Iterator实例化;
c、使用Iterator迭代输出,每个内容都是Map.Entry的对象;
d、通过Map.Entry进行key-value的分离。
public class IteratorDemo04 {
public static void main(String[] args) {
Map<Object,String> map = new HashMap<Object,String>();
map.put(1, "zhangsan");
map.put(2, "lisi");
map.put(3, "wangwu");
// 声明Set集合(泛型为Map.Entry类),用Map的实例map对Set接口实例化
Set<Map.Entry<Object,String>> allSet = map.entrySet();
// 声明Iterator接口(泛型与Set一致),对其实例化
Iterator<Map.Entry<Object, String>> iter = allSet.iterator();
// 迭代输出
while(iter.hasNext()){
// 找到Map.Entry实例
Map.Entry<Object, String> me = iter.next();
System.out.println(me.getKey()+"--->"+me.getValue());
}
}
}
输出结果:
1--->zhangsan
2--->lisi
3--->wangwu
(3)删除集合的指定内容
Iterator中的remove()方法
public class IteratorDemo02 {
/**
* 删除内容
*/
public static void main(String[] args) {
List<String> all = new ArrayList<String>();
all.add("hello");
all.add("_");
all.add("world");
System.out.println("创建的集合内容:"+all);
Iterator<String> iter = all.iterator();
while(iter.hasNext()){
String str = iter.next();
if("_".equals(str)){
iter.remove();
}
}
System.out.println("删除之后:"+all);
}
}
输出结果:
创建的集合内容:[hello, _, world]
删除之后:[hello, world]
2、ListIterator 双向迭代输出
此种输出方式只有List接口可以做到
由前向后:.next(); 由后向前:.previous()
若想完成由后向前输出,必须先进行由前向后输出。
3、foreach
foreach可以完成数组或集合的输出,
for(类 对象 :集合){
// 集合操作
}
public class ForEachDemo {
/**
* foreach输出集合内容
*/
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
// String:集合指定的泛型;str:命名的对象;list:集合实例。输出对象
for(String str : list){
System.out.println(str);
}
}
}
输出结果:
aaa
bbb
ccc
总之,集合的输出最常用的几种方式:for循环,Iterator,foreach
对于ArrayList,Vector 其核心是一个数组, 如果明确知道List的实例是ArrayList,Vector,当然用 for(int i=0; i<lst.size();i++){} 这种方式是最快的. 当然用Iterator 的话,其实是相关无几,Iterator 基本上都是指针操作, Iterator本身的处理会增加一点点的开销,跟踪一下源码就可以知道.
Iterator 好处:通用,对于所有集合,使用Iterator性能都一样, 客户端自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。
客户端从不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。
foreach和Iterator差不多,核心是一样的。