Java迭代器vs for循环
晚上好, 我试图对arraylist中的每个像素调用“ricolora”方法(更改像素的颜色),第一个方法(使用迭代器的方法)不起作用 它给了我一个异常(java.lang.reflect.InvocationTargetException) 第二种方法(用于循环)工作得很好。你能帮我理解为什么第一个方法不起作用吗?我认为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
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
通常首选迭代器
版本,因为它在任何情况下都能很好地执行<