1, Iterator:
(1). 使用
hasNext();返回一个boolearn值,判断有没有下一个
next();返回游标当前的指向对象,并且将游标指向下一个对象
remove();删除游标左面的元素,在next执行完之后该操作只能执行一次
注意点:
remove()使用之前必须要调用next()方法,而且remove()方法不能连续出现
//使用while实现迭代集合
Iterator<Integer> itea =list.iterator(); //获取得带器对象;
while (itea.hasNext()) {
Integer value =itea.next();
System.out.print(value+" ");
}
//使用for循环实现迭代
for( Iterator iter=list.iterator();iter.hasNext();) {
String str1=(String)iter.next();
System.out.println(str1);
}
注意点二:遍历Map稍有不同; 在获取迭代器对象时有些不同
//使用迭代器遍历map
Iterator iter=map.entrySet().iterator();
while(iter.hasNext()) {
Map.Entry e=(Entry) iter.next();
Object k= e.getKey();
Object v=e.getValue();
System.out.println(k+"---"+ v);
}
(2),主要方法分析:
boolean hasNext() 是否还有下一个元素
public boolean hasNext() {
return cursor != size;
}
E next() 返回当前游标指向的元素,并将游标指向下一个元素
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
void remove() 删除当前游标指向元素左边的元素 (只能和next()方法配合使用)
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
(3)要点问题:
1,,解决并发异常的方法: checkForComodification()
集合会追踪修改(增删改查)的次数(modCount 又称版本号),每一个迭代器会单独立维护自己的计数器,在每次操作,检查版本号是否发生改变,如果个改变,就会抛出ConcurrentModificationException() 异常;
《java核心技术卷一 587页详解》
2 ,使用foreach遍历集合,实际上底层也是调用了迭代器
2, ListIterator:
(1) 使用:
注意点:
因为listinteator是继承iterator接口的,和Iterator相同。但是listiteator可以从后往前遍历集合,所以此类多了一些方法;
(2)特有方法:
listIterator(int index) //构造器,可以从指定下标处开始遍历
void add(E newelement) //往当前位置的前面添加元素
void set(E newelement) //用新元素取代前面next()或者previous()返回的元素;
boolean hasPrevious() //同hasNext(),判断是否有前一个元素
E previous() //用法和next相同,返回当前元素,并把游标指向下一个元素
int previousIndex() // 和previous()用法相同,只不过返回的是的该元素的下标
int nextIndsx() //和next()用法相同,只不过返回的是的该元素的下标
(3)主要方法分析:
同iterator,原理相同;
迭代器总结:
迭代器使用于专门遍历集合,iteatore 实现的是iteator接口,listiterator实现的是 listinteator接口,但是listinteator接口又是继承与iterator的,所以两者有公用的方法,但是listiteator可是实现从后往前遍历以及添加元素和修改元素等操作,所以独有的方法,在使用中,遍历set和ArrayList的操作是相同的,遍历Map有一些不同而已,同时,在多线程方面,为了防止并发异常的发生,在操作前校验版本号(每个迭代器独立计数的修改次数),避免发生异常。