概述
在java中,要对List中的元素遍历并进行删除时,通常使用以下代码:
代码一:
//list是一个List<String>对象
Iterator it = list.iterator();
while(it.hasNext()){
String str = it.next();
if("codefunjava".equals(str)){
it.remove();
}
}
而不是使用这样的代码:
代码二:
for(int i = 0; i < list.size(); i++){
String str = list.get(i);
if("codefunjava".equals(str)){
list.remove(i);
}
}
实际情况中,使用代码二会出现ConcurrentModificationException异常,而使用代码一则不会,这也是在对List集合中的元素进行遍历且删除时,使用代码一的原因。那么代码一是如何做到删除元素而不产生异常的呢?以下是本人参照java类结构写的Iterator类的原理:
首先是Collection.java类,在java.util包中,此类为所有集合类的父类,在此处本人选取了几个与iterator相关的方法:
package com.codejavafun.iterator;
public interface Collection {
void add(Object o);
Object remove(int position);
int size();
Iterator iterator();
}
然后是Iterator类,此类定义了三个方法:
package com.codejavafun.iterator;
public interface Iterator {
Object next();
boolean hasNext();
public void remove();
}
接下来是ArrayList类,此类实现了Collection接口:
package com.codejavafun.iterator;
import com.codejavafun.iterator.Collection;
public class ArrayList implements Collection {
Object[] objects = new Object[10];
int index = 0;
@Override
public void add(Object o) {
if(index == objects.length) {
Object[] newObjects = new Object[objects.length * 2];
System.arraycopy(objects, 0, newObjects, 0, objects.length);
objects = newObjects;
}
objects[index] = o;
index ++;
}
@Override
public Object remove(int position) {
if(index < objects.length){
Object obj = objects[position];
for(int i = position; i < index; i++){
objects[i] = objects[i + 1];
}
index --;
return obj;
}else{
throw new IndexOutOfBoundsException("list越界");
}
}
@Override
public int size() {
return index;
}
@Override
public Iterator iterator() {
return new ArrayListIterator();
}
private class ArrayListIterator implements Iterator {
private int currentIndex;
private int lastRet;
//上一次返回元素索引
public ArrayListIterator(){
currentIndex = 0;
lastRet = -1;
}
@Override
public boolean hasNext() {
if(currentIndex >= index) return false;
else return true;
}
@Override
public Object next() {
lastRet = currentIndex;
Object o = objects[lastRet];
currentIndex ++;
return o;
}
@Override
public void remove(){
ArrayList.this.remove(lastRet);
currentIndex = lastRet;
lastRet = -1;
}
}
}
最后,写一个测试类:
package com.codejavafun.iterator;
class Cat {
public Cat(int id) {
super();
this.id = id;
}
private int id;
public int getId(){
return this.id;
}
public void setId(int id){
this.id = id;
}
@Override
public String toString() {
return "cat:" + id;
}
}
public class Test {
public static void main(String[] args) {
Collection c = new ArrayList();
for(int i=0; i<15; i++) {
c.add(new Cat(i));
}
Iterator it = c.iterator();
while(it.hasNext()) {
Cat o = (Cat)it.next();
if(o.getId() == 8){
it.remove();
}
}
System.out.println(c.size());
Iterator it2 = c.iterator();
while(it2.hasNext()) {
Cat o = (Cat)it2.next();
System.out.println(o + " ");
}
}
}
运行结果:
由运行结果可知,成功此将元素删除了。
最后
以上就是真实大象为你收集整理的ArrayList的iterator()方法剖析的全部内容,希望文章能够帮你解决ArrayList的iterator()方法剖析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复