概述
2019独角兽企业重金招聘Python工程师标准>>>
ArrayList提供了Iterator遍历机制。ArrayList以内部类的形式实现Iterator接口。
//通过iterator()方法返回Iterator对象。
public Iterator<E> iterator() {
//Itr为一个实现Iterator接口的内部类
return new Itr();
}
下面我们可以看一下Itr的源码
private class Itr implements Iterator<E> {
//当前要返回的元素索引
int cursor;
// index of next element to return
//当前要返回的元素索引-1
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
//判断是否还有下一个元素
public boolean hasNext() {
return cursor != size;
}
//取出元素
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
//当前索引大于list长度,抛出异常
if (i >= size)
throw new NoSuchElementException();
//声明局部变量,赋值为当前对象的所有元素
Object[] elementData = ArrayList.this.elementData;
//大于数组长度,抛出异常
if (i >= elementData.length)
throw new ConcurrentModificationException();
//游标下移
cursor = i + 1;
//返回当前元素,并将当前元素索引赋值给lastRet
return (E) elementData[lastRet = i];
}
//移除当前元素
public void remove() {
//小于0抛出异常
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
//调用当前对象方法移除元素
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
//后面代码未给出
}
ArrayList同时提供了一个更为强大的方法listIterator,也是通过内部类来实现。
//从当前索引开始遍历
public ListIterator<E> listIterator(int index) {
if (index < 0 || index > size)
throw new IndexOutOfBoundsException("Index: "+index);
return new ListItr(index);
}
//从第一个元素开始遍历
public ListIterator<E> listIterator() {
return new ListItr(0);
}
我们看一下ListItr类,它继承了Itr类,并且实现ListIterator接口,ListIterator接口继承Iterator接口。它提供了除了Itr类中方法之外更加强大的方法。
private class ListItr extends Itr implements ListIterator<E> {
//继承Itr里面的类变量
ListItr(int index) {
super();
cursor = index;
}
//是否有前一个元素
public boolean hasPrevious() {
return cursor != 0;
}
//返回当前元素索引
public int nextIndex() {
return cursor;
}
返回上一个元素索引
public int previousIndex() {
return cursor - 1;
}
//返回上一个元素
@SuppressWarnings("unchecked")
public E previous() {
checkForComodification();
int i = cursor - 1;
if (i < 0)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i;
return (E) elementData[lastRet = i];
}
//在当前索引设置新元素
public void set(E e) {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.set(lastRet, e);
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
//添加新元素
public void add(E e) {
checkForComodification();
try {
int i = cursor;
ArrayList.this.add(i, e);
cursor = i + 1;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
}
转载于:https://my.oschina.net/jettyWang/blog/912835
最后
以上就是神勇羽毛为你收集整理的ArrayList Iterator遍历的全部内容,希望文章能够帮你解决ArrayList Iterator遍历所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复