Java迭代器未按预期工作

Java迭代器未按预期工作,java,Java,我试图使用迭代器将名为ShuttleTimeline的服务对象添加到和ArrayList中,前提是该服务在时间表中不存在。然而,正如ouput所看到的,add方法中的迭代器即使在时间表改变时也保持不变。我是初学者,不明白为什么。我很想了解这是为什么 public void addService(Service service) throws NullPointerException { boolean contains=false; if (service==nu

我试图使用迭代器将名为ShuttleTimeline的服务对象添加到和ArrayList中,前提是该服务在时间表中不存在。然而,正如ouput所看到的,add方法中的迭代器即使在时间表改变时也保持不变。我是初学者,不明白为什么。我很想了解这是为什么

public void addService(Service service) throws NullPointerException {
        boolean contains=false;
        if (service==null)
            throw new NullPointerException();
        Iterator<Service> itr = ShuttleTimetable.iterator();
        while (itr.hasNext()){
            Service s=itr.next();
            System.out.println(s.toString()); //this is just to test the iterator
            if (service.equals(s))
                contains=true;
                break;
        }
        if (contains==false)
            ShuttleTimetable.add(service);
        }
这是结果输出:

Departs House of Noise after session 1 for arena
Departs House of Noise after session 1 for arena
Departs House of Noise after session 1 for arena
Departs House of Noise after session 1 for arena
Departs House of Noise after session 1 for arena
Departs House of Noise after session 1 for arena
Departs House of Noise after session 1 for arena, Departs House of Noise after session 1 for The Corner, Departs House of Noise after session 2 for arena, Departs The Corner after session 1 for hell, Departs arena after session 2 for hell, Departs arena after session 2 for House of Noise, Departs arena after session 2 for hell, 

正如@JB所说,使用contains将节省大量工作。然而,理解代码中发生的事情是很重要的

首先,print语句不打印迭代器,而是打印当前迭代器项。对你来说,这是一种服务

其次,您可能没有在服务中提供equals(..)方法的自定义实现。equals方法的默认实现比较对象引用。我想,在您的示例中,服务在其场地和会话匹配时是相等的,而不是在其对象引用匹配时。因此,如果您没有重写equals方法,它可能会“行为异常”


顺便说一句,无论何时重写“equals”,都应该重写hashCode方法以防止不一致。如果要使用ArrayList中的“contains”方法,这一点尤为重要。

能否提供shuffletimetable和Services的代码,并告诉我们为什么不简单地使用backing集合的contains()方法而不是使用迭代器?我现在觉得很傻,是的,我可能应该只使用contains()方法。感谢您是否重写了类
服务
中的
equals()
方法?如果不这样做,它将无法正常工作。hashCode()方法在ArrayList.contains()中不起任何作用。它在将服务实例存储在HashSet中或作为HashMap中的键时起作用。
Departs House of Noise after session 1 for arena
Departs House of Noise after session 1 for arena
Departs House of Noise after session 1 for arena
Departs House of Noise after session 1 for arena
Departs House of Noise after session 1 for arena
Departs House of Noise after session 1 for arena
Departs House of Noise after session 1 for arena, Departs House of Noise after session 1 for The Corner, Departs House of Noise after session 2 for arena, Departs The Corner after session 1 for hell, Departs arena after session 2 for hell, Departs arena after session 2 for House of Noise, Departs arena after session 2 for hell,