由Maurice Naftalin,Philip Wadler研究Java Generics and Collection书籍,我在CopyOnWriteArraySet部分离开了,在学习的同时尝试练习使它坚持我的想法,但我遇到了一个问题,让我揭示我的琐碎代码: / p>
CopyOnWriteArrayList<Character> modifiableSet = new CopyOnWriteArrayList<Character>();
modifiableSet.add('a');modifiableSet.add('d');
for(Character ch:modifiableSet){
if(ch.equals('d')){
modifiableSet.remove(ch); // compiler neglects this, as expected,
// since CopyOnWriteArraySet is synchronous
}
}
for(Iterator<Character> its = modifiableSet.iterator();its.hasNext();){
Character firstElement = its.next();
if(firstElement.equals('a'))its.remove();// compiler does not give a damn here
// since CopyOnWriteArrayList is synchronous java.lang.UnsupportedOperationException
// surprisingly, wondering If CopyOnWriteArrayList is synchronous,
// why the compiler shouts here ?
}
到目前为止,我的大脑才明白,每当CopyOnWriteArraySet
发生修改时,使用新更改创建的新支持数组,问题是,是否经过CopyOnWriteArraySet
到iterator()
发生在支持阵列或前阵列上,如果说前阵列很方便,我认为CopyOnWriteArraySet.remove()
在前阵列上工作是合理的,而CopyOnWriteArraySet.iterator().remove()
适用于后备阵列,我是对的吗?
任何闪光灯都非常感谢,谢谢大家。
答案 0 :(得分:3)
CopyOnWriteArraySet API非常清楚
•Iterators do not support the mutative remove operation.
这是因为CopyOnWriteArraySet的迭代器“在构造迭代器时依赖于数组的不变快照”。