在研究Collection
API时,我们发现如果Collection的当前实现,某些方法(add
,remove
,...)可能会抛出java.lang.UnsupportedOperationException
不支持这些功能。
实际上,JDK中是否存在不支持这些方法的具体Collection
?
非常感谢您的回答。
答案 0 :(得分:28)
除了Collections.unmodifiable*
方法返回的集合之外,还有一些有趣的案例,其中UnsupportedOperationException
实际上被抛出:
Map
,entrySet()
和keySet()
访问的values()
的集合视图可以移除但未添加元素,Arrays.asList
返回的列表视图可以包含既未添加也未删除的元素Collections.empty*
和Collections.singleton*
方法获得的对象也标记为“immutable”,因此 - 尽管未在API文档中明确说明 - 我想这些也会在尝试修改它们时引发异常。答案 1 :(得分:19)
明显的例子是从Collections.unmodifiableCollection()
和其他类似方法返回的实现。将更改Collection
的方法抛出此异常。
答案 2 :(得分:14)
通常在创建List<String> sample=Collections.emptyList();
之类的列表时。列表sample
将创建为Collections.unmodifiableCollection()
。
因此列表示例不支持动态列表操作。您只能使用赋值运算符将另一个列表分配给此列表。 EG&GT;
List<String> ls=new ArrayList<String>();
ls.add("one");
ls.add("Three");
ls.add("two");
ls.add("four");
sample = ls;
对于动态列表操作,您应该有类似的语法
List<String> sample= new ArrayList<String>();
。在此列表中,您可以执行sample.add(), sample.addAll()
等...
答案 3 :(得分:4)
是。例如,当您致电Collections.unmodifiableList(list)
时,返回的列表不支持add(..)
但是,这些集合大多是私有类,不会公开API,因此您无法实例化它们。