HashMap.values().addAll()异常
问题:在使用一个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()异常相关推荐
- HashMap中ConcurrentModificationException异常解读
HashMap中ConcurrentModificationException异常解读 参考文章: (1)HashMap中ConcurrentModificationException异常解读 (2) ...
- java hashmap value_Java HashMap values() 方法
values() 方法返回映射中所有 value 组成的 Set 视图. 语法 values() 方法的语法为: hashmap.values() 注:hashmap 是 HashMap 类的一个对象 ...
- Java之HashMap.values()转List时的错误和正确操作
因为项目中需要获取到Map的值的集合,所以调用了HashMap.values()方法转成List,当时是使用了以下代码.(逻辑上这样想应该没问题,但生活总是会是不是给你一点小""惊 ...
- Java中级部分内容笔记 异常 I/O 集合框架 泛型 Lambda
Java中级学习过程 参考的是所长的Java中级内容 1异常处理 1.1异常的定义 在我们打开文件的过程中,文件可能存在且被打开,也有可能不存在.在此时,Java会自动抛出一个异常,让我们必须去处理两 ...
- java map用二叉树_【课堂笔记分享】linkedlist、二叉树、hashmap
LinkedList序列分先进先出FIFO,先进后出FILO FIFO在Java中又叫Queue 队列 FILO在Java中又叫Stack 栈 LinkedList 与 List接口与ArrayLis ...
- java中hashmap_Java HashMap – Java中的HashMap
java中hashmap Java HashMap is one of the most popular Collection classes in java. Java HashMap is Has ...
- 【Java源码分析】Java8的HashMap源码分析
Java8中的HashMap源码分析 源码分析 HashMap的定义 字段属性 构造函数 hash函数 comparableClassFor,compareComparables函数 tableSiz ...
- HashMap源码解析(JDK1.8)
HashMap源码解析(JDK1.8) 目录 定义 构造函数 数据结构 存储实现源码分析 删除操作源码分析 hashMap遍历和异常解析 1. 定义 HashMap实现了Map接口,继承Abstrac ...
- 【集合之HashMap】HashMap实现原理及非线程安全原因
要知道HashMap是什么,首先要搞清楚它的数据结构,在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也 ...
最新文章
- vue 不是内部或外部命令,也不是可运行的程序 或批处理文件
- 灰度图像的对数变换原理及OpenCV代码实现
- Boost.MultiIndex 使用散列索引的示例
- SpringBoot集成JPA
- socket connect java_网络编程 – 为什么Java的socket.connect()消耗100%的cpu资源?
- opencv-4.5.3 + opencv_contrib-4.5.3 + vtk-9.0.3编译(全流程)
- 蔬菜大棚原理_天津大棚报价大棚的造价、温室大棚
- Alibaba分层领域模型规约
- Linux下Nginx+Tomcat整合的安装与配置
- matlab 下的集成学习工具箱
- wps转html乱码,wps换电脑乱码怎么办
- 中国慢病管理行业市场形势调查分析及价值研究报告2021-2027年版
- 仙人掌圆方树学习笔记
- C语言库函数access的使用
- Keras框架下的loss损失函数
- 联网查看图片的Demo
- pandas 学习汇总10 - 统计:窗口函数rolling,expanding( tcy)
- 电子商务系统建设(十一)
- 串口硬盘和并口硬盘的区别
- 用计算机语言写结婚祝福语,非常有用的结婚祝福语
热门文章
- ad走线画直线_作为立体几何的热点,直线与平面的平行关系,到处都是考试的影子...
- JavaScript的使用
- LeetCode算法题-Convert a Number to Hexadecimal(Java实现)
- Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.2. The Python language
- 11.5. blockquote
- SAP ECC6.0-中建信息版
- extern C __declspec(dllexport) __declspec(dllimport) 和 def
- log4j配置文件详解
- 大型互联网应用中的日志系统
- C++网络编程(一)