Java集合之Collections 剖析
Collections工具类位于 java.util 包下,是一个比较常用的工具类,关于这个工具类,主要介绍其在使用过程中遇到的大坑!!!
【事故现场】
在实际项目开发过程中,在前人代码的基础上,对于一个集合添加元素,抛出java.lang.UnsupportedOperationException异常,对于一个List 集合,常见的添加元素就报错了,很让人费解。
【事故剖析】
在常见的初始化一个集合List时,比较常见的是 List list = new ArrayList(); 我们可以随意对该集合进行add 和 remove 操作,但是前人代码初始化集合时使用的是 List emptyList = Collections.EMPTY_LIST;比较新奇,所谓存在即合理,看源码!!!
首先这个EMPTY_LIST 初始化时新建了一个EmptyList类,这个类EmptyList继承于AbstractList类,在上一篇博文中https://www.cnblogs.com/Demrystv/p/11608109.html 已经提过这个类,不能对其进行add 或者 remove方法,原因是在源码中其就会抛出异常,看到这里,为什么对EMPTY_LIST添加或者移除元素抛异常就迎刃而解了。



【事故反思】
Collections.EMPTY_LIST返回的是一个空的List。在某个函数中返回的List可能为空,采用常规的ArrayList等我们需要进行是否为null 的判断,但是采用这个Collections.EMPTY_LIST可以减少判断的步骤。相比于ArrayList,这个在初始化时占用较少的资源,所以这就是Collections.EMPTY_LIST的优势。但是,需要注意的是我们在后续不能对其add或者 remove操作,否则就会抛异常。同理,EMPTY_MAP和EMPTY_SET在使用时也要多加注意。
Java集合之Collections 剖析的更多相关文章
- 转:【Java集合源码剖析】Java集合框架
转载轻注明出处:http://blog.csdn.net/ns_code/article/details/35564663 Java集合工具包位于Java.util包下,包含了很多常用的数据结构, ...
- Java—集合框架 Collections.sort()、Comparable接口和Comparator接口
Collentions工具类--java.util.Collections Collentions是Java集合框架中,用来操作集合对象的工具类,也是Java集合框架的成员,与List.Map和Set ...
- 【Java集合源码剖析】Java集合框架
Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集合框架下大致可以分为如下五个部分:List列表.Set集合.Map映射.迭 ...
- Java集合之Arrays 剖析
Arrays工具类位于 java.util 包下,是一个比较常用的工具类,其可以针对数组进行各种操作,比如赋值.排序.搜索等等.在项目过程中我们针对数组的有关操作,如果不方便直接操作,均可通过调用此类 ...
- 转:【Java集合源码剖析】Hashtable源码剖析
转载请注明出处:http://blog.csdn.net/ns_code/article/details/36191279 Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元 ...
- 转:【Java集合源码剖析】Vector源码剖析
转载请注明出处:http://blog.csdn.net/ns_code/article/details/35793865 Vector简介 Vector也是基于数组实现的,是一个动态数组,其容量 ...
- 转:【Java集合源码剖析】ArrayList源码剖析
转载请注明出处:http://blog.csdn.net/ns_code/article/details/35568011 本篇博文参加了CSDN博文大赛,如果您觉得这篇博文不错,希望您能帮我投一 ...
- 【Java集合源码剖析】Hashtable源码剖析
转载出处:http://blog.csdn.net/ns_code/article/details/36191279 Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元素是一 ...
- Java集合源码剖析——ArrayList源码剖析
ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...
随机推荐
- javascript 客户端webSocket示例
//html <script> // 初始化一个 WebSocket 对象 var ws = new WebSocket("ws://localhost:9998/echo&qu ...
- 使用github--stanfordnlp--glove训练自己的数据词向量
1.准备语料 准备好自己的语料,保存为txt,每行一个句子或一段话,注意要分好词.将分好词的语料保存为×××.txt 2.准备源码 下载地址:https://github.com/stanfordnl ...
- Java之——23种设计模式汇总
在软件开发的历程中,正是无数前辈们本着追求完美的架构设计和代码设计的初心.经过无数前辈们的探索和努力,逐渐形成了一系列的设计原则和设计模式. 对于Java语言来说,通常包含有6大设计原则和23种设计模 ...
- 算法将一个对象中的某一个key值变为true,其他值都为false
主要运用在,v-if v-show切换不同内容时,非常快的打开某一个区域,关闭其他的区域哈. 这样就不需要每一个设置false,打开区域设置为true. 可以优化代码哈 for in 主要循环对象(空 ...
- 【小方法】navicate for mysql使数据库可以识别中文
右键选择新建数据库,将字符集与排序规则改成utf-8形式
- THINKPHP-RCE-POC
thinkphp-RCE-POC 官方公告: 1.https://blog.thinkphp.cn/869075 2.https://blog.thinkphp.cn/910675 POC: thin ...
- js循环小练习
function fn(){ //打印三角形 for(var i = 1 ; i <= 30 ; i++){ for(var x = 1; x <= i; x++ ){ document. ...
- codewars--js--Roman Numerals Encode
问题描述:(将阿拉伯数字转换成罗马数字) Create a function taking a positive integer as its parameter and returning a st ...
- 跨域打开页面:Uncaught DOMException: Blocked a frame with origin
Uncaught DOMException: Blocked a frame with origin 使用postMessage()方法可以解决跨域传值的问题 Api: https://develop ...
- C++ 解决列车重排问题
问题节选自<<数据结构.算法与应用(C++语言描述)>>, 思路与代码为原创, 如有疏漏及问题欢迎指正 问题描述: 一辆列车有n节车厢, 车厢排列乱序(如: 284657139 ...