在abstractmap类中,为什么remove()不显示UnsupportedOperationException?

时间:2013-09-05 15:51:43

标签: java dictionary collections

我正在阅读[AbstractMap][1]的代码,我看到了

 public V More ...put(K key, V value) {
        throw new UnsupportedOperationException();
    }

put()方法抛出异常。

虽然remove()有一个很大的实现。并且不会引发此异常。

有人可以解释为什么这么偏见吗?

3 个答案:

答案 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。