在遍歷該集合時將元素添加到可修改的SortedSet
安全嗎?特別是,將元素添加到集合中的後續元素比迭代器指示的元素更安全嗎?在迭代時向SortedSet添加元素是否安全
例如,將下面的代碼破壞SortedSet s
或拋出一個異常(這將可能是一個ConcurrentModificationException
):
/**
* s not null, is modifiable.
*/
private final addSelectedFollowers(final SortedSet<Integer> s)
{
for (Integer i: s) {
if (shouldAddNext(i)) {
s.add(i + 1);
}
}
}
protected abstract boolean shouldAddNext(int i);
我的猜測是,它是安全的,但我不能在JRE API文檔中找到明確的聲明。我知道如果行爲沒有被指定,實現可以自由決定行爲。在SortedSet
的文件中缺乏明確的說明是不夠的,回答這個問題的方式或其他;所需的行爲可能會間接指定,在不同的類或接口的文檔中。不幸的是,JRE文檔並不總是明確說明允許的內容。因此,我正在尋找參考JRE API的答案,而不是光頭斷言是或否。我也知道SortedSet
可以做成unmodifiable,這會使SortedSet.add()
失敗;我對可修改的SortedSet
感興趣。
請注意,我問的是添加元素的集合,而不是modifying elements within the set。
取決於'SortedSet'的實現。只需選擇已知的子類,「ConcurrentSkipListSet」不會; 'TreeSet'會。 –
@AndyTurner @fabian實現'interface'的程序員實現一個'interface'必須符合他/她使用的所有'interface'和'classes'的合約(規範)。所以它*不依賴於實現,*如果合約(規範)指示只能通過具有我感興趣的屬性的實現來滿足。我的問題的實質是找到JRE規範的一部分這表明'SortedSet'具有該屬性,或者顯示實現可能無法獲得該屬性並且符合JRE規範。 – Raedwald
@Rededwald,如果接口沒有指定行爲,那麼決定他們想要做什麼取決於實現。 –