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