Java迭代器vs for循环

Java迭代器vs for循环,java,for-loop,iterator,Java,For Loop,Iterator,晚上好, 我试图对arraylist中的每个像素调用“ricolora”方法(更改像素的颜色),第一个方法(使用迭代器的方法)不起作用 它给了我一个异常(java.lang.reflect.InvocationTargetException) 第二种方法(用于循环)工作得很好。你能帮我理解为什么第一个方法不起作用吗?我认为for循环和迭代器几乎是一样的 谢谢你的帮助 public class DisegnoManoLibera { protected final ArrayList

晚上好,

我试图对arraylist中的每个像素调用“ricolora”方法(更改像素的颜色),第一个方法(使用迭代器的方法)不起作用

它给了我一个异常(java.lang.reflect.InvocationTargetException)

第二种方法(用于循环)工作得很好。你能帮我理解为什么第一个方法不起作用吗?我认为for循环和迭代器几乎是一样的

谢谢你的帮助

public class DisegnoManoLibera {
       protected final ArrayList<Pixel> pixel;

       final public void ricolora(Color c) {
          Iterator<Pixel> it = this.pixel.iterator();
          int i=0;
          while(it.hasNext()){
              Pixel pi =(Pixel) it.next();
              Pixel gi = new Pixel(pi.getX(), pi.getY(), c);
              pixel.remove(i);
              pixel.add(i, gi);
              i++;
          }
       }

    final public void ricolora(Color c) {
         for(int i=0; i<this.pixel.size();i++){
            Pixel pip = pixel.get(i);
            Pixel gin = new Pixel(pip.getX(), pip.getY(), c);
            pixel.remove(i);
            pixel.add(i, gin);
         }
    }
public class Pixel {
  final int x;
  final int y;
  final Color c;
public class disignomonalibera{
受保护的最终阵列列表像素;
最终公共空白ricolora(c色){
Iterator it=this.pixel.Iterator();
int i=0;
while(it.hasNext()){
Pixel pi=(Pixel)it.next();
像素gi=新像素(pi.getX(),pi.getY(),c);
像素移除(i);
添加(i,gi);
i++;
}
}
最终公共空白ricolora(c色){
对于(inti=0;ihavalook,这解释了在列表中有哪些不同的迭代方式。
在这里,您可以看到,在使用迭代器(您的
pixel.remove(i);
pixel.add(i,gi);
)时,不应该操纵基础列表

另一种方法是,可以使用具有remove()和add()方法的(或者在您的示例中,使用set()替换元素)

for(ListIterator iter=list.ListIterator();iter.hasNext();){
E元素=iter.next();
//1-可以调用元素的方法
//2-可以使用iter.remove()从列表中删除当前元素
//3-可以使用iter.add(…)在列表中插入新元素
//在元素和iter之间->下一步()
//4-可以使用iter.set(…)替换当前元素
// ...
}
再次引用另一篇帖子:

注意:正如@amarseillan所指出的,这种形式对于遍历列表来说是一个糟糕的选择,因为get方法的实际实现可能没有使用迭代器时那么有效

看一看,这解释了在列表中有哪些不同的迭代方式。 在这里,您可以看到,在使用迭代器(您的
pixel.remove(i);
pixel.add(i,gi);
)时,不应该操纵基础列表

另一种方法是,可以使用具有remove()和add()方法的(或者在您的示例中,使用set()替换元素)

for(ListIterator iter=list.ListIterator();iter.hasNext();){
E元素=iter.next();
//1-可以调用元素的方法
//2-可以使用iter.remove()从列表中删除当前元素
//3-可以使用iter.add(…)在列表中插入新元素
//在元素和iter之间->下一步()
//4-可以使用iter.set(…)替换当前元素
// ...
}
再次引用另一篇帖子:

注意:正如@amarseillan所指出的,这种形式对于遍历列表来说是一个糟糕的选择,因为get方法的实际实现可能没有使用迭代器时那么有效


为集合获取
迭代器的代码中的点,不建议对集合进行调整大小、添加或删除等操作所导致的结构修改。如果需要该功能,可以尝试使用。

为集合获取
迭代器的代码中的点不建议对集合进行调整大小、添加或删除等操作所导致的修改。如果需要该功能,您可以尝试使用。

当您可以简单地替换该值时,为什么要删除和添加?您应该使用或

迭代集合时,通常不允许修改集合,除非通过迭代器。大多数集合对象的迭代器实现快速失效逻辑,以防止意外违反该规则。例外情况适用于专门为多线程并发访问而设计的集合

因此,如果使用
迭代器
,则仅通过该迭代器进行修改

// Using ListIterator
public final void ricolora(Color c) {
    for (ListIterator<Pixel> it = this.pixel.listIterator(); it.hasNext(); ) {
        Pixel pi = it.next();
        Pixel gi = new Pixel(pi.getX(), pi.getY(), c);
        it.set(gi);
    }
}

// Using index
public final void ricolora(Color c) {
    for (int i = 0; i < this.pixel.size(); i++) {
        Pixel pi = this.pixel.get(i);
        Pixel gin = new Pixel(pi.getX(), pi.getY(), c);
        this.pixel.set(i, gin);
    }
}
//使用ListIterator
公共最终无效ricolora(c色){
for(ListIterator it=this.pixel.ListIterator();it.hasNext();){
像素pi=it.next();
像素gi=新像素(pi.getX(),pi.getY(),c);
it.set(gi);
}
}
//使用索引
公共最终无效ricolora(c色){
对于(int i=0;i

通常首选
迭代器
版本,因为无论
列表
实现如何,它都能很好地执行,例如,如果
列表
是一个
链接列表
为什么要删除和添加,而您可以简单地替换该值?您应该使用或

迭代集合时,通常不允许修改集合,除非通过迭代器。大多数集合对象的迭代器实现快速失效逻辑,以防止意外违反该规则。例外情况适用于专门为多线程并发访问而设计的集合

因此,如果使用
迭代器
,则仅通过该迭代器进行修改

// Using ListIterator
public final void ricolora(Color c) {
    for (ListIterator<Pixel> it = this.pixel.listIterator(); it.hasNext(); ) {
        Pixel pi = it.next();
        Pixel gi = new Pixel(pi.getX(), pi.getY(), c);
        it.set(gi);
    }
}

// Using index
public final void ricolora(Color c) {
    for (int i = 0; i < this.pixel.size(); i++) {
        Pixel pi = this.pixel.get(i);
        Pixel gin = new Pixel(pi.getX(), pi.getY(), c);
        this.pixel.set(i, gin);
    }
}
//使用ListIterator
公共最终无效ricolora(c色){
for(ListIterator it=this.pixel.ListIterator();it.hasNext();){
像素pi=it.next();
像素gi=新像素(pi.getX(),pi.getY(),c);
it.set(gi);
}
}
//使用索引
公共最终无效ricolora(c色){
对于(int i=0;i
通常首选
迭代器
版本,因为它在任何情况下都能很好地执行<