我正在阅读[AbstractMap][1]
的代码,我看到了
public V More ...put(K key, V value) {
throw new UnsupportedOperationException();
}
put()方法抛出异常。
虽然remove()有一个很大的实现。并且不会引发此异常。
有人可以解释为什么这么偏见吗?
答案 0 :(得分:3)
默认的remove
操作只是迭代条目集而不是聪明。 remove
可以“始终” 1 以这种方式实现,即使它非常缓慢。
put
总是需要知道精确的实施细节,包括地图是否可以修改。
对于不可修改的映射,迭代器不支持remove
,尽管这似乎是不平衡的。
1 仅当迭代器支持remove时才会出现这种情况,如文档所述。
答案 1 :(得分:1)
AbstractMap
类旨在成为读写和只读映射的基础。
必须实现getter,因此实现使用抽象方法entrySet
。但是,如果地图是只读的,put
可能仍未实现。文档说:
要实现可修改的映射,程序员必须另外覆盖此类的
put
方法(否则会抛出UnsupportedOperationException
),并且entrySet().iterator()
返回的迭代器必须另外实现其remove
1}}方法。
请注意,设计人员可能没有实现put
方法,需要程序员明确地覆盖它。但是,所有只读实现都必须提供相同的实现(即抛出UnsupportedOperationException
),因此设计人员选择将此实现放入共享代码库中。
另一方面,remove
方法可以根据派生类必须实现的现有操作来实现,因此Java库中的实现是非空的。它假设entrySet().iterator()
实现了它的remove
- 如果没有,AbstractMap
的remove会抛出迭代器的remove
抛出的异常,大概是{{ 1}}。
答案 2 :(得分:0)
" If such an entry is found, its value is
* obtained with its <tt>getValue</tt> operation, the entry is removed
* from the Collection (and the backing map) with the iterator's
* <tt>remove</tt> operation, and the saved value is returned."
通过Iterator删除操作查看它所说的删除操作。我想如果底层Map实现是不可变的,它会从iterator remove方法中抛出unsupportedexception。