Java 在abstractmap类中,为什么remove()不显示UnsupportedOperationException?
我正在读Java 在abstractmap类中,为什么remove()不显示UnsupportedOperationException?,java,dictionary,collections,Java,Dictionary,Collections,我正在读[AbstractMap][1]的代码,我看到了 public V More ...put(K key, V value) { throw new UnsupportedOperationException(); } put()方法引发异常 而remove()有一个很大的实现。并且不会引发此异常 有人能解释为什么会有这种偏见吗?默认的remove操作只是在条目集上迭代,而不是很聪明删除可以“始终”1以这种方式实现,即使速度非常慢 put始终需要知道精确的实施细
[AbstractMap][1]
的代码,我看到了
public V More ...put(K key, V value) {
throw new UnsupportedOperationException();
}
put()方法引发异常
而remove()有一个很大的实现。并且不会引发此异常
有人能解释为什么会有这种偏见吗?默认的
remove
操作只是在条目集上迭代,而不是很聪明<代码>删除可以“始终”1以这种方式实现,即使速度非常慢
put
始终需要知道精确的实施细节,包括地图是否可修改
对于不可修改的映射,迭代器不支持remove
,尽管这似乎不平衡
1只有当迭代器支持删除时,这才是正确的,就像文档状态一样。默认的
remove
操作只是在条目集上迭代,而不是巧妙地执行<代码>删除可以“始终”1以这种方式实现,即使速度非常慢
" 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."
put
始终需要知道精确的实施细节,包括地图是否可修改
对于不可修改的映射,迭代器不支持remove
,尽管这似乎不平衡
1只有当迭代器支持删除时,这才是真的,如文档状态所示。
“如果找到这样的条目,其值为
" 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."
*通过其getValue操作获得,该条目将被删除
*使用迭代器的
*删除操作,并返回保存的值。“
请看它所说的删除操作是通过迭代器删除操作进行的。我假设,如果基础映射实现是不可变的,它将从迭代器移除方法中抛出unsupportedexception。“如果找到这样一个条目,则其值为
*通过其getValue操作获得,该条目将被删除
*使用迭代器的
*删除操作,并返回保存的值。“
请看它所说的删除操作是通过迭代器删除操作进行的。我假设,如果基础映射实现是不可变的,它将从迭代器移除方法中抛出不支持的异常。抽象映射类被设计为读写和只读映射的基础 必须实现getter,因此实现使用抽象方法
entrySet
。但是,如果映射是只读的,put
可能保持未实现。文件说:
为了实现一个可修改的映射,程序员必须另外重写这个类的put
方法(否则会抛出一个UnsupportedOperationException
),并且entrySet()返回的迭代器。迭代器()
必须另外实现它的remove
方法
注意,设计者可能没有实现put
方法,要求程序员显式重写它。但是,所有只读实现都必须提供相同的实现(即抛出UnsupportedOperationException
),因此设计者选择将此实现放在共享代码库中
另一方面,
remove
方法可以根据派生类必须实现的现有操作来实现,因此Java库中的实现是非空的。它假设entrySet().iterator()
实现了它的remove
——如果它没有实现,AbstractMap
的remove将抛出迭代器的remove
抛出的任何异常,据推测,UnsupportedOperationException
AbstractMap
类被设计为读写和只读映射的基础
必须实现getter,因此实现使用抽象方法entrySet
。但是,如果映射是只读的,put
可能保持未实现。文件说:
为了实现一个可修改的映射,程序员必须另外重写这个类的put
方法(否则会抛出一个UnsupportedOperationException
),并且entrySet()返回的迭代器。迭代器()
必须另外实现它的remove
方法
注意,设计者可能没有实现put
方法,要求程序员显式重写它。但是,所有只读实现都必须提供相同的实现(即抛出UnsupportedOperationException
),因此设计者选择将此实现放在共享代码库中
另一方面,
remove
方法可以根据派生类必须实现的现有操作来实现,因此Java库中的实现是非空的。它假设entrySet().iterator()
实现了它的remove
——如果它没有实现,AbstractMap
的remove将抛出迭代器的remove
抛出的任何异常,大概是UnsupportedOperationException
@Thinker大概是迭代器不支持remove
@Thinker大概是迭代器不支持remove
。你不能创建一个抽象映射,只能创建一个子类来覆盖这些方法就是说,remove
可以通过其他操作来实现,而put
不能。你不能创建一个抽象映射,只能创建一个子类来覆盖这些方法。“偏差”就是,remove
可以通过其他操作来实现,而put
不能。