Java 即使在使用迭代器之后也会获得并发修改异常

Java 即使在使用迭代器之后也会获得并发修改异常,java,concurrentmodification,Java,Concurrentmodification,考虑以下代码: if(!unmatchedNewTruckRequirementSet.isEmpty()){ for(Iterator<TruckRequirement> iterator = unmatchedNewTruckRequirementSet.iterator(); iterator.hasNext();){ TruckRequirement newTruckRequirement = iterator.next();

考虑以下代码:

 if(!unmatchedNewTruckRequirementSet.isEmpty()){
        for(Iterator<TruckRequirement> iterator = unmatchedNewTruckRequirementSet.iterator(); iterator.hasNext();){
            TruckRequirement newTruckRequirement = iterator.next();
            for(Iterator<TruckRequirement> iterator1 = oldTruckRequirementSet.iterator(); iterator1.hasNext();){
                TruckRequirement oldTruckRequirement1 = iterator1.next();
                if(oldTruckRequirement1.getTruckClassName().equals(newTruckRequirement.getTruckClassName())) {
                    LogUtil.logInfo("Truck Requirement Changed ", "Truck Requirement Changed : From : {0} to {1} where Truck Class is: {2}",
                            new Object[]{oldTruckRequirement1.getNumberOfTrucks(), newTruckRequirement.getNumberOfTrucks(), newTruckRequirement.getTruckClassName()});
                    unmatchedNewTruckRequirementSet.remove(newTruckRequirement);
                }
            }LogUtil.logInfo("Truck Requirement Added ", "New Truck Requirement Added with Truck Class : {0} and number of Trucks : {1}",
                    new Object[]{newTruckRequirement.getTruckClassName(), newTruckRequirement.getNumberOfTrucks()});

    }else {
        if(oldTruckRequirementSet.size() > unmatchedNewTruckRequirementSet.size()){
            for(TruckRequirement truckRequirement : oldTruckRequirementSet) {
                LogUtil.logInfo("Truck Requirement Removed ", "Truck Requirement Removed with Truck Class : {0}",
                        new Object[]{truckRequirement.getTruckClassName()});
            }
        }
    }
if(!unmatchedNewTruckRequirementSet.isEmpty()){
for(迭代器迭代器=不匹配的newtruckrequirementset.Iterator();迭代器.hasNext();){
TruckRequirement newTruckRequirement=迭代器.next();
for(迭代器迭代器1=oldTruckRequirementSet.Iterator();迭代器1.hasNext();){
TruckRequirement oldTruckRequirement1=iterator1.next();
if(oldTruckRequest1.getTruckClassName().equals)(newTruckRequest.getTruckClassName()){
LogUtil.logInfo(“卡车需求更改”,“卡车需求更改:从:{0}到{1}”,其中卡车类为:{2}”,
新对象[]{oldTruckRequest1.getNumberOfTrucks(),NewTruckRequest.getNumberOfTrucks(),NewTruckRequest.getTruckClassName()});
不匹配的新ruckrequirementset.remove(新ruckrequirement);
}
}LogUtil.logInfo(“添加了卡车需求”,“添加了卡车类别:{0}和卡车数量:{1}的新卡车需求”,
新对象[]{newTruckRequirement.getTruckClassName(),newTruckRequirement.getNumberOfTrucks()});
}否则{
如果(oldTruckRequirementSet.size()>unmatchedNewTruckRequirementSet.size()){
用于(卡车需求卡车需求:旧卡车需求集){
LogUtil.logInfo(“卡车需求已删除”,“卡车需求已使用卡车类删除:{0}”),
新对象[]{truckRequirement.getTruckClassName()});
}
}
}
我使用迭代器对两个哈希集进行了迭代:
unmatchedNewTruckRequiremnetSet
,另一个是
oldTruckRequirementSet

当我尝试从未匹配的NewRuckRequiremNetSet中删除集合时,会出现并发修改异常。请帮助。

如果使用
集合,您将获得
ConcurrentModificationException
。在循环时删除
添加
方法

必须使用迭代器.remove()删除并避免异常

for(Iterator<TruckRequirement> iterator1 = oldTruckRequirementSet.iterator(); iterator1.hasNext();){
    TruckRequirement oldTruckRequirement1 = iterator1.next();
    if(oldTruckRequirement1.getTruckClassName().equals(newTruckRequirement.getTruckClassName())) {
        LogUtil.logInfo("Truck Requirement Changed ", 
                "Truck Requirement Changed : From : {0} to {1} where Truck Class is: {2}",
                new Object[]{oldTruckRequirement1.getNumberOfTrucks(), 
                newTruckRequirement.getNumberOfTrucks(), newTruckRequirement.getTruckClassName()});

        // Use the iterator to remove
        iterator1.remove();
    }
}
for(迭代器迭代器1=oldTruckRequirementSet.Iterator();迭代器1.hasNext();){
TruckRequirement oldTruckRequirement1=iterator1.next();
if(oldTruckRequest1.getTruckClassName().equals)(newTruckRequest.getTruckClassName()){
LogUtil.logInfo(“卡车要求已更改”,
“卡车需求已更改:从:{0}更改为{1},其中卡车类为:{2}”,
新对象[]{oldTruckRequirement1.getNumberOfTrucks(),
newTruckRequirement.getNumberOfTrucks(),newTruckRequirement.getTruckClassName());
//使用迭代器删除
迭代器1.remove();
}
}

但我需要删除具有匹配类名的truckrequirement,即iterator1.remove(),但需要删除该特定的truck。它将删除iterator1.next()方法返回的truckrequirement。读取JavaDoc