为什么阿里规约手册要求谨慎使用Arrays.asList方法
前言
在开发中,有时候会碰到把多个参数,或者说把数组转成List的需求,通常我们会使用 Arrays.asList()方法。但是该方法在使用的过程中,稍有不慎就会出现严重的异常。有如下代码:
@Test
public void test() {
List<String> list = Arrays.asList("a", "a", "2");
System.out.println(list.size());
list.add("blog.happyjava.cn");
System.out.println(list.size());
}
复制代码
运行之后,出现了异常:
阿里Java规约中的强制性要求
在阿里Java规约中有强制性的要求:使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
阿里规约里已经提示了asList返回的对象是Arrays的一个内部类。那么这个内部类,跟我们一般用到的List(如ArrayList)有什么不一样之处呢,下面我们就来分析下。
Arrays.asList()源码分析
通过IDEA查看该方法源码,如下:
这里返回了一个ArrayList,看起来似乎没什么问题,但是这个ArrayList跟我们常用的java.util.ArrayList不一样。通过IDEA点击跳转,可以看到该ArrayList是Arrays的一个内部类。
该内部类的源码其实不多,通过IDEA的structure,我们可以看到它实现的方法如下:
可以看到,这里是没有实现我们最常用的add方法的。
那么,调用add等方法的时候,UnsupportedOperationException 异常是哪里抛出来的呢?我们看它继承的java.util.AbstractList类,该类的add方法如下:
public boolean add(E e) {
add(size(), e);
return true;
}
复制代码
这里有一个重载的add方法,再点进去查看:
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
复制代码
可以看到,是这里抛出了UnsupportedOperationException。
总结
Arrays.asList()是开发中非常常用的方法,所以我们一定要了解其存在的坑点。如果把其返回的ArrayList当做了我们常用的java.util.ArrayList,那么是很容易埋下生产隐患的。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基于栈的内存分配 —— alloca
- 第七章 字符串
- lldb-入坑指北(1)-给xcode添加批量启用禁用断点功能
- 第八章 指针
- Django入门笔记——第二章、Django安装
- lldb 入坑指北(2)- 15行代码搞定二进制与源码映射
- lldb入坑指北(4)-打印任意函数的汇编代码
- ElasticSearch索引 VS MySQL索引
- Python随机打乱列表中的元素
- Python面试题汇总
- lldb 入坑指北(3) - 打印 c++ 实例的虚函数表
- 一文让你彻底搞懂`__str__`和`__repr__`?
- lldb 入坑指北(1) - 给Xcode批量添加启用&禁用断点功能
- Xcode 中的 Workspace、Project、Target 和 Scheme
- 学习Python一年,这次终于弄懂了浅拷贝和深拷贝