集合的四种输出方式
一、iterator迭代输出(最为常用)
Collection接口自JDK1.5之后,开始继承了Iterable父接口,并可以通过iterator()方法来获取到iterator对象来进行迭代。主要用到的api有以下三个:
public boolean hasnext() -> 用于判断是否有下一个待迭代元素
public Iterator<E> next() -> 用于获取迭代对象
public void remove(); -> 用于删除该迭代对象
```public static void main(String[] args) {
List list =new ArrayList<>();
list.add("STR1");
list.add("STR2");
list.add("STR3");
//获取iterator对象
Iterator iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
```
输出的结果为
STR1
STR2
STR3
二、ListIterator 双向迭代输出
这种迭代的方式使用情况比较少,特别之处在于一般的迭代是单向的从前往后迭代,但是ListIterator还支持从后往前迭代。
同时,Collection接口中并没有定义ListIterator的获取方法,想要获取ListIterator对象,相关的定义方法是自JDK1.2开始有的
```
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/**
* Created by moutory on 2020-07-05.
*/
public class IteratorTest {
public static void main(String[] args) {
List list =new ArrayList<>();
list.add("STR1");
list.add("STR2");
list.add("STR3");
//获取ListIterator对象
ListIterator listIterator = list.listIterator();
System.out.println("向后迭代输出");
while (listIterator.hasNext()){
System.out.println(listIterator.next());
}
System.out.println("向前迭代输出");
while ((listIterator.hasPrevious())){
System.out.println(listIterator.previous());
}
}
}
```
输出结果为:
向后迭代输出
STR1
STR2
STR3
向前迭代输出
STR3
STR2
STR1
注意:ListIterator并不是想象中的任意就可以往前迭代,而是要先调用next()方法,将指针拨到最后,才能通过previous()方法获取到前面的元素,否则直接使用previous获取到的对象为0;
三、Enumberation枚举迭代输出
Enumberation是在JKD1.0的时候就出现的输出接口,主要是为了Vetor集合类使用。
注:vetor集合类其实跟arrayList相似,不同点是Vector是线程安全的
主要的api:
public Enumeration<E> elements(); -> 获取enum对象
public boolean hasMoreElement() -> 和iterator相似,判断是否有下一个元素
public E nextElement(); ->获取下一个迭代元素
输出:
vector1
vector2
vector3
四、foreach输出(日常常用)
输出结果为:
str1
str2
str3
总结起来,对于集合元素的迭代输出使用,很多时候我们用到的多是第一种和最后一种(其中使用第一种可能会更加贴合方法设计的初衷),同时,使用第一种方法进行迭代的时候要注意,中间不要使用list的remove方法去移除元素,要使用iterator的remove,否则会报并发修改异常。
原因详见:https://blog.csdn.net/sukier_JE/article/details/79898892
其实就是modCount和expectedModCount的同步问题