在我的哈希集代码中
我想实现一个ConcurrentModificationException
,以便当有人尝试在迭代器之后添加或删除它时,它将被抛出。
这是代码的一部分:
/** Need to add ConcurrentModificationException stuff*/
public boolean hasNext()
{
if (current != null && current.next != null)
{
return true;
}
for (int b = bucketIndex + 1; b < buckets.length; b++)
{
if (buckets[b] != null)
{
return true;
}
}
return false;
}
/** Need to add ConcurrentModificationException stuff*/
public Object next()
{
if (current != null && current.next != null)
{
current = current.next; // Move to next element in bucket
} else
// Move to next bucket
{
do
{
bucketIndex++;
if (bucketIndex == buckets.length)
{
throw new NoSuchElementException();
}
current = buckets[bucketIndex];
} while (current == null);
}
return current.data;
}
最佳答案
添加实例变量int modcount = 0
;每次调用增变子(例如add
或remove
)时,将其递增。创建新的迭代器时,请设置其实例变量int myModcount = modcount
;在其next
方法中,如果myModtcount != modcount
则抛出一个ConcurrentModificationException
。 (我认为Java迭代器不会在hasNext
方法中抛出此错误,而只会在next
方法中抛出该错误。)
这样做的理由是,您可以拥有多个迭代器,例如,
Iterator itr1 = hashMap.iterator();
hamMap.put(obj1, obj2);
Iterator itr2 = hashMap.iterator();
此时,
itr1.next()
将抛出一个ConcurrentModificationException
,但itr2.next()
不会。如果您的迭代器实现了
remove
或任何其他突变器,则这些变量将递增myModcount
以及modcount
。