0

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

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

put() 方法抛出异常。

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

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

4

3 回答 3

3

默认remove操作只是迭代条目集而不是聪明。remove可以“总是” 1以这种方式实现,即使它非常缓慢。

put总是需要知道精确的实现细节,包括地图是否可修改。

对于不可修改的映射,迭代器不支持remove,尽管这看起来不平衡。


1仅当迭代器支持删除时,如文档所述,这才是正确的。

于 2013-09-05T15:55:41.327 回答
1

该类AbstractMap被设计为读写和只读映射的基础。

getter 必须实现,所以实现使用抽象方法entrySet。但是,put如果地图是只读的,则可能保持未实现。文档说:

要实现一个可修改的映射,程序员必须另外重写这个类的put方法(否则会抛出一个UnsupportedOperationException),并且由返回的迭代器entrySet().iterator()必须另外实现它的remove方法。

请注意,设计者可能put未实现该方法,需要程序员明确地覆盖它。但是,所有只读实现都必须提供相同的实现(即抛出UnsupportedOperationException),因此设计人员选择将此实现放入共享代码库中。

remove另一方面,该方法可以根据派生类必须实现的现有操作来实现,因此Java库中的实现是非空的。它假设entrySet().iterator()实现了它的remove- 如果没有,AbstractMap'remove 将抛出迭代器抛出的任何异常remove,大概是UnsupportedOperationException.

于 2013-09-05T15:57:58.180 回答
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."

看看它说的是删除操作是通过迭代器删除操作发生的。我想如果底层 Map 实现是不可变的,它会从它的迭代器 remove 方法中抛出 unsupportedexception。

于 2013-09-05T15:56:18.597 回答