下面是我今天回答帖子中最尴尬的一个,
问题:请直接看下面第一段代码的注释处
下面两段代码主要是说明通过内部类来实现,多重继承的功能,通过内部类来继承Event类,然后外部类继承Controller类,将继承了Event的内部类对象放到eventList中,来调用。
Java code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->package controller;
import java.util.*;
public class Controller {
private List<Event> eventList = new ArrayList<Event>();
public void addEvent(Event c){ eventList.add(c); }
public void run(){
while(eventList.size() > 0){
//for(Event e : eventList){ //如果是直接用,则会出错。
for(Event e : new ArrayList<Event>(eventList)){ //为什么这里要再新建一个new ArrayList<Event>(eventList)?
if(e.ready()){
System.out.println(e);
e.action();
eventList.remove(e);
}
}
}
}
}
Java code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->package controller;
public abstract class Event {
private long eventTime;
protected final long delayTime;
public Event(long delayTime){
this.delayTime = delayTime;
}
public void start(){
eventTime = System.nanoTime() + delayTime;
}
public boolean ready(){
return System.nanoTime() >= eventTime;
}
public abstract void action();
}
我一直以为:
//for(Event e : eventList){ //如果是直接用,则会出错。
for(Event e : new ArrayList <Event>(eventList)){
//为什么这里要再新建一个new ArrayList <Event>(eventList)?
为什么会出现这样的错误呢,其实原因是楼主没有理解透for循环中创建的均为临时变量,
如:这里在for 循环中Event e,其实是创建的临时对象,它的生命周期只是在这个for循环之内,
当for循环结束时,就会自动销毁了,所以需要建立一个new ArrayList <Event>(eventList)临时对象来实现循环,
不然就会出现上述情况。
后来企鹅老兄说:ArrayList的问题,迭代的时候不允许修改. 结贴.
我太自卑了,呵呵,现在会了,以后就知道了!
分享到:
相关推荐
System.out.println("以下是ArrayList迭代的第一种方法……………………………………………………"); Iterator<String> ite = arrayList.iterator(); while (ite.hasNext()) { System.out.println(ite.next()); } ...
如果多个线程同时访问同一个ArrayList实例,并且其中至少有一个线程在结构上修改了列表(指的是改变列表的大小),那么必须在外部保持同步,以避免数据不一致的问题。这种情况下,可以通过诸如Collections....
3. **线程不安全**:默认情况下,`ArrayList`不是线程安全的,意味着在多线程环境下,多个线程同时修改`ArrayList`可能会导致数据不一致。如果需要在多线程环境下使用,可以考虑使用`Collections.synchronizedList`...
ArrayList的迭代器(Iterator)允许我们以任意顺序遍历元素,并且支持remove操作。但是,迭代过程中修改ArrayList(非迭代器自身调用的remove方法)可能不会抛出异常,而是造成未定义的行为,因此在并发编程中需要...
ArrayList提供了一种高效的方式来管理大量的元素,并且提供了迭代器(Iterator)来遍历这些元素,使得我们可以在不暴露底层实现细节的情况下访问和修改列表中的元素。这个资源的目的是通过模拟Java ArrayList的...
边遍历边删除元素在ArrayList中并不推荐,因为ArrayList的迭代器不支持并发修改。如果在迭代过程中删除元素,可能会抛出`ConcurrentModificationException`。正确的做法是使用Iterator的`remove()`方法,或者先收集...
ArrayList 类继承自 AbstractList 类并实现了 List 接口,这意味着它可以被用作一个有序的元素集合,允许我们在任何位置进行插入和删除操作。 1. **ArrayList 的特点** - **动态扩展**:ArrayList 可以根据需要...
这个类的主要目的是提供一个类似数组的结构,允许在运行时动态调整大小,并且提供了丰富的操作方法,如添加元素、删除元素、修改元素以及查询元素等。下面将详细介绍C++实现ArrayList类的关键知识点。 首先,`...
### jdk源码阅读一:ArrayList #### 一、ArrayList简介与特性 ArrayList作为Java集合框架中的重要组成部分,被...然而,在多线程环境下,需要注意ArrayList的线程安全问题,以避免潜在的数据不一致和其他并发问题。
迭代器模式(IteratorPattern)是设计模式中的一种行为模式,它提供了一种顺序访问聚合对象元素的方法,同时又不暴露其底层表示。这种模式允许我们遍历集合对象的元素,而无需暴露其内部结构。在Java、C#等面向对象...
- 修改元素:set()方法允许通过索引更改现有元素。 - 查找元素:get()方法通过索引获取元素,indexOf()和lastIndexOf()分别查找第一个和最后一个匹配元素的索引。 - 遍历集合:可以通过for循环、迭代器iterator()或...
迭代器模式是一种行为设计模式,主要目的是在不暴露集合内部结构的情况下,允许外部代码遍历集合的所有元素。这种模式将遍历操作从集合类中分离出来,实现了数据结构和遍历机制的解耦。在大多数编程语言中,迭代器...
迭代器模式是一种设计模式,属于行为设计模式,它允许我们顺序访问聚合对象的元素,而无需暴露其底层表示。在Java、C#等面向对象语言中,迭代器模式被广泛应用于容器类,如ArrayList、LinkedList等,使得我们可以...
在软件工程中,迭代器模式允许我们遍历一个集合对象的所有元素,而无需暴露集合的内部结构。这种模式将遍历操作与集合对象本身分离,使得我们可以使用不同的方式遍历同一个集合,或者对不同的集合进行遍历。 在Java...
- **并发控制**:通过检查修改计数等机制,迭代器模式能够有效地处理并发访问问题。 ### 四、总结 迭代器模式是Java编程中非常实用的一种设计模式,它不仅简化了集合对象的遍历操作,还提高了程序的灵活性和可扩展...
- **安全访问**:迭代器通常不允许修改聚合对象的状态,防止并发修改时出现的问题。 5. **迭代器模式的分类**: - **简单迭代器**:只提供基本的`hasNext()`和`next()`方法。 - **反向迭代器**:支持反向遍历。 ...
这意味着在多线程环境下,多个线程可以同时操作`Vector`而不会产生数据不一致的问题。但是,由于其同步机制,性能通常低于`ArrayList`。 4. **HashTable类**: `HashTable`是`Dictionary`类的子类,是一个键值对...
因此,在并发的修改,迭代器很快就会完全失败,而不是在将来不确定的时间任意冒险,不确定性的行为。 注意的迭代器无法保证,因为,一般来说快速失败行为,不可能作出任何硬性保证不同步并发修改的存在。 快速失败...
当ArrayList在迭代过程中被修改(例如添加、删除元素),迭代器会立即抛出ConcurrentModificationException,以防止数据的不一致性。这是一种设计模式,用于快速检测并发修改,以避免潜在的错误。 总的来说,...
迭代器模式是一种行为设计模式,它允许我们顺序访问聚合对象的元素,而无需暴露其底层表示。在Java、Python、C#等编程语言中,迭代器模式被广泛应用于集合类,如ArrayList、LinkedList等,提供了统一的遍历接口,...