迭代器
Iterator
:迭代器类,集合的专用遍历方式。可以说迭代器类其实是集合类的内部类。
它不依赖于索引遍历。
创建对象
Iterator<E> iterator()
//返回此集合中元素的迭代器,
通过集合的iterator()
方法得到
- 迭代器是通过集合的
iterator()
方法得到的,所以我们可以说它是依赖于集合而存在的
成员方法
方法 | 说明 |
---|---|
boolean hasNext() | 如果迭代还有元素,则返回true(判断集合是否为空或是否遍历完毕) |
E next() | 获取当前迭代元素,并后移指针。 |
void remove() | 删除迭代器所指向的元素。 |
注意:
- 迭代器遍历完毕后,指针不会复位。
如果想再次遍历,需要重新创建迭代器对象。
- 循环中只能使用一次
next()
方法,因为next方法会后移指针。
如果想多次使用next获取的数据,可以用一个变量接收。
- 迭代器遍历过程中,不能使用集合的方法进行增删。
如果想删除,可以使用迭代器提供的remove()
方法。
如果想增加,目前没有办法。
遍历集合的步骤
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class iteratorDemo {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<String>();
coll.add("Hello");
coll.add("World");
//1.用集合里的iterator()方法得到集合对象c的迭代器对象 it
Iterator<String> it = coll.iterator();
//2.使用hasNext()方法判断集合中是否还有元素
while (it.hasNext()) {
//3.使用next()方法获取元素
String s = it.next();
System.out.println(s); // Hello \n World
}
}
}
并发修改异常
并发修改异常ConcurrentModificationException
。并发修改的意思就是同一时刻发生并修改。当方法检测到对象的并发修改,但不允许这种修改时,会抛出此异常。迭代器及并发修改异常
原理:
集合中的属性modCount
在遍历时发生改变。
modCount
记录了集合发生结构性修改的次数。
结构性修改:改变list的size大小。如添加、删除元素;仅仅修改元素的内容不叫结构性修改。
当遍历集合时,Iterator
的对象将跟踪集合属性modCount
当前记录的值。如果通过添加或删除元素来修改集合,modCount
将发生改变,导致modCount
的值前后不匹配,因此Iterator
将抛出ConcurrentModificationException
Collections工具类
导包:java.util.Collections
Collections是一个集合操作工具类。
Collections常用方法
方法 | 说明 |
---|---|
static boolean addAll(Collection<T> c, T... elements) | 给单列集合批量添加元素 |
static void shuffle(List<?> list) | 打乱List集合中元素的顺序 |
static void sort(List<T> list) | 自然排序List集合 |
static void sort(List<T> list, Comparator<T> c) | 根据指定规则排序List集合 |
static int binarySearch(Lish<T> list, T key) | 在List集合中二分查找元素key |
static void copy(List<T> old, List<T> new) | 拷贝List集合 |
static void max/min(Collection<T> coll) | 根据自然排序获取单列集合中元素最大/最小值 |
static void swap(List<?> list, int i, int j) | 交换List集合中指定位置的元素 |
static int fill(List<T> list, T obj) | 用指定元素填充List集合 |