单例地图中的UnsupportedOperationException

时间:2018-07-13 10:18:48

标签: java hashmap

每当我尝试运行以下代码时,它都会引发UnsupportedOperationException

但是,据我了解,它应该可以正常工作,因为我正在计算K中已经存在的Map的值

public class MyClass {
public static void main(String[] args) {
    Collections.singletonMap("k", "v").computeIfAbsent("k", k -> "v" ); 
   }
}

有人可以帮助我了解这种行为吗?

4 个答案:

答案 0 :(得分:3)

Collections.singletonMap()不会返回完全实现的Map

public static <K,V> Map<K,V> singletonMap(K key, V value) {
        return new SingletonMap<>(key, value);
}

尝试更新地图的操作将抛出UnsupportedOperationException(否则,返回的地图将不再是不变的)

答案 1 :(得分:3)

该方法的javadoc说:

  

返回一个不变的映射,仅将指定的键映射到指定的值。返回的地图可序列化。

因此:尝试变异该方法返回的地图毫无意义。

答案 2 :(得分:0)

Map Collections.singletonMap是不可变的,不支持put()。如果不存在,则计算是否将键和值放入地图(如果不存在)。

使用其他Map类型或仅使用get()。

答案 3 :(得分:0)

  

但是,据我了解,它在我计算时应该可以正常工作   Map中已经存在的K的值

使用Map创建的singletonMap()实例实际上不允许在地图中添加或删除条目。
但是,不变性已经超越了。这意味着无法更改对象的整个状态。因此,无论您尝试哪种方式,都不允许更新现有条目(即使具有与示例中相同的值):

Collections.singletonMap("k", "v").computeIfAbsent("k", k -> "v" ); 

实际上,SingletonMap实例唯一受支持的方法是检索方法:get()entrySet(),因此...对于……以及任何返回Map条目的受支持方法都将返回防御性复制它们,就像任何不可变的类都应该做的那样。

另外,请注意public static singletonXXX()中的所有java.util.Collections方法(singleton()singletonList()singletonMap())都返回不可变的实例。