问题:在使用一个Collection.addAll()方法时报告UnsupportedOperationException。追溯原因发现该collection是来自于hashMap.values()。

分析原因:通过查看源代码,发现hashMap.values()实现如下:

   //HashMap.javapublic Collection<V> values() {Collection<V> vs = values;return (vs != null ? vs : (values = new Values()));}private final class Values extends AbstractCollection<V> {public Iterator<V> iterator() {return newValueIterator();}public int size() {return size;}public boolean contains(Object o) {return containsValue(o);}public void clear() {HashMap.this.clear();}}//其中values的定义如下:AbstractMap.javatransient volatile Collection<V> values = null;public Collection<V> values() {if (values == null) {values = new AbstractCollection<V>() {public Iterator<V> iterator() {return new Iterator<V>() {private Iterator<Entry<K,V>> i = entrySet().iterator();public boolean hasNext() {return i.hasNext();}public V next() {return i.next().getValue();}public void remove() {i.remove();}};}public int size() {return AbstractMap.this.size();}public boolean isEmpty() {return AbstractMap.this.isEmpty();}public void clear() {AbstractMap.this.clear();}public boolean contains(Object v) {return AbstractMap.this.containsValue(v);}};}return values;}

从上面代码看到,hashMap.values()先看values是否为空:

  • 如果不为空,则直接返回values。values是在在AbstractMap中定义的,初始化时new了一个AbstractCollection,并实现了若干方法,但是并没有实现all()和addAll()方法。

  • 如果为空,则new一个内部实现类Values。Values同样没有实现AbstractCollection的没有实现all()和addAll()方法。

再来看一下AbstractCollection的add()和addAll()方法:

 //AbstractCollection.javapublic boolean add(E e) {throw new UnsupportedOperationException();}public boolean addAll(Collection<? extends E> c) {boolean modified = false;for (E e : c)if (add(e))modified = true;return modified;}

可以看到,add方法的实现是直接抛出UnsupportedOperationException,addAll方法调用add方法,也间接抛出异常,同样的,HashMap.values()调用add()和addAll()也会抛出异常。

结论:通过以上分析,明确了HashMap.values()调用add()和addAll()抛出异常的原因。也告诉我们在实际使用中,要注意避免直接使用HashMap.values().add()和HashMap.values().addAll()。

转载于:https://blog.51cto.com/imu2008/1620312

HashMap.values().addAll()异常相关推荐

  1. HashMap中ConcurrentModificationException异常解读

    HashMap中ConcurrentModificationException异常解读 参考文章: (1)HashMap中ConcurrentModificationException异常解读 (2) ...

  2. java hashmap value_Java HashMap values() 方法

    values() 方法返回映射中所有 value 组成的 Set 视图. 语法 values() 方法的语法为: hashmap.values() 注:hashmap 是 HashMap 类的一个对象 ...

  3. Java之HashMap.values()转List时的错误和正确操作

    因为项目中需要获取到Map的值的集合,所以调用了HashMap.values()方法转成List,当时是使用了以下代码.(逻辑上这样想应该没问题,但生活总是会是不是给你一点小""惊 ...

  4. Java中级部分内容笔记 异常 I/O 集合框架 泛型 Lambda

    Java中级学习过程 参考的是所长的Java中级内容 1异常处理 1.1异常的定义 在我们打开文件的过程中,文件可能存在且被打开,也有可能不存在.在此时,Java会自动抛出一个异常,让我们必须去处理两 ...

  5. java map用二叉树_【课堂笔记分享】linkedlist、二叉树、hashmap

    LinkedList序列分先进先出FIFO,先进后出FILO FIFO在Java中又叫Queue 队列 FILO在Java中又叫Stack 栈 LinkedList 与 List接口与ArrayLis ...

  6. java中hashmap_Java HashMap – Java中的HashMap

    java中hashmap Java HashMap is one of the most popular Collection classes in java. Java HashMap is Has ...

  7. 【Java源码分析】Java8的HashMap源码分析

    Java8中的HashMap源码分析 源码分析 HashMap的定义 字段属性 构造函数 hash函数 comparableClassFor,compareComparables函数 tableSiz ...

  8. HashMap源码解析(JDK1.8)

    HashMap源码解析(JDK1.8) 目录 定义 构造函数 数据结构 存储实现源码分析 删除操作源码分析 hashMap遍历和异常解析 1. 定义 HashMap实现了Map接口,继承Abstrac ...

  9. 【集合之HashMap】HashMap实现原理及非线程安全原因

    要知道HashMap是什么,首先要搞清楚它的数据结构,在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也 ...

最新文章

  1. vue 不是内部或外部命令,也不是可运行的程序 或批处理文件
  2. 灰度图像的对数变换原理及OpenCV代码实现
  3. Boost.MultiIndex 使用散列索引的示例
  4. SpringBoot集成JPA
  5. socket connect java_网络编程 – 为什么Java的socket.connect()消耗100%的cpu资源?
  6. opencv-4.5.3 + opencv_contrib-4.5.3 + vtk-9.0.3编译(全流程)
  7. 蔬菜大棚原理_天津大棚报价大棚的造价、温室大棚
  8. Alibaba分层领域模型规约
  9. Linux下Nginx+Tomcat整合的安装与配置
  10. matlab 下的集成学习工具箱
  11. wps转html乱码,wps换电脑乱码怎么办
  12. 中国慢病管理行业市场形势调查分析及价值研究报告2021-2027年版
  13. 仙人掌圆方树学习笔记
  14. C语言库函数access的使用
  15. Keras框架下的loss损失函数
  16. 联网查看图片的Demo
  17. pandas 学习汇总10 - 统计:窗口函数rolling,expanding( tcy)
  18. 电子商务系统建设(十一)
  19. 串口硬盘和并口硬盘的区别
  20. 用计算机语言写结婚祝福语,非常有用的结婚祝福语

热门文章

  1. ad走线画直线_作为立体几何的热点,直线与平面的平行关系,到处都是考试的影子...
  2. JavaScript的使用
  3. LeetCode算法题-Convert a Number to Hexadecimal(Java实现)
  4. Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.2. The Python language
  5. 11.5. blockquote
  6. SAP ECC6.0-中建信息版
  7. extern C __declspec(dllexport) __declspec(dllimport) 和 def
  8. log4j配置文件详解
  9. 大型互联网应用中的日志系统
  10. C++网络编程(一)