为什么阿里规约手册要求谨慎使用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,那么是很容易埋下生产隐患的。
写在最后
为什么阿里规约手册要求谨慎使用Arrays.asList方法的更多相关文章
- 为什么要谨慎使用Arrays.asList、ArrayList的subList?
1. 使用Arrays.asList的注意事项 1.1 可能会踩的坑 先来看下Arrays.asList的使用: List<Integer> statusList = Arrays.asL ...
- java Arrays.asList方法注意事项
1. 简介 Arrays.asList()方法可以将数组转化为长度固定的列表. 该方法强调了列表的长度是固定的,因此不能使用list的add和remove方法修改list长度. 2. 示例 impor ...
- Arrays.asList()方法的限制
Arrays.asList()方法的限制是他对所产生的List类型做出了最理想的假设 package example; import java.util.Arrays; import java.uti ...
- 工具类Arrays.asList()方法把数组转换成集合
工具类Arrays.asList()方法把数组转换成集合 不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException() 问 ...
- Arrays类——Arrays.asList()方法使用
java.util类 Arrays java.lang.Object——java.util.Arrays public class Arrays extends Object 此类包含用来操作数组(比 ...
- Arrays类--Arrays.asList()方法使用
java.util类 Arrays java.lang.Object——java.util.Arrays public class Arrays extends Object 此类包含用来操作数组(比 ...
- Arrays.asList方法总结
import java.util.Arrays; import java.util.List; /** * * 本类演示了Arrays类中的asList方法 * 通过四个段落来演示,体现出了该方法的相 ...
- java——Arrays.asList()方法
Arrays.asList() 是将数组作为列表 问题来源于: public class Test { public static void main(String[] args) { int[] a ...
- JDK5的新特性之可变参数&Arrays.asList()方法
[代码] package com.hxl; import java.util.Arrays; import java.util.List; public class Test { public sta ...
随机推荐
- Chrome资源嗅探器应用
http://hi.baidu.com/thankyouanyway/item/5230a49a7665848959146142 在网上转转,经常会发现一些好视频,但是往往找不到下载地址,或者需要安装 ...
- HLJU 1188 Matrix (二维树状数组)
Matrix Time Limit: 4 Sec Memory Limit: 128 MB Description 给定一个1000*1000的二维矩阵,初始矩阵中每一个数都为1,然后为矩阵有4种操 ...
- LeetCode 三数之和 — 优化解法
LeetCode 三数之和 - 改进解法 题目:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复 ...
- CloudEngine 6800基础配置-01_常见密码操作
由于工作原因,现在从事公有云. 这简直就是个笑话,12年后又回来学网络知识. # 设置系统的日期.时间和时区 <HUAWEI> clock timezone BJ add 08:00: ...
- 修改Cygwin的默认启动目录
安装Cygwin后发现Cygwin默认的用户主目录是Windows的用户主目录(一般为:C:\Users\[UserName]\),要想修改为cygwin安装目录下的home\[UserName]\可 ...
- 深圳MPD大会 讲师演讲稿 2014-10
深圳MPD大会 讲师演讲稿 2014-10 互联网下的蛋-姜志辉.pdf: http://www.t00y.com/file/76704370 俞炜-互联网研发整形术 终于版.pdf: htt ...
- 数据分析在web交互设计中的作用 页面跳出率 100% 原因分析
通过分析访问的路径,发现,访问者访问其他页面,直接跳出 页面跳出率 100% 说明: 连作者都发现的导航路径不清晰 对导航进行改版:清晰.明了
- 我的Android进阶之旅------>Android中MediaRecorder.stop()报错 java.lang.RuntimeException: stop failed.【转】
本文转载自:http://blog.csdn.net/ouyang_peng/article/details/48048975 今天在调用MediaRecorder.stop(),报错了,java.l ...
- XAML实例教程系列 - 依赖属性和附加属性(四)
XAML实例教程系列 - 依赖属性和附加属性 2012-06-07 13:11 by jv9, 1479 阅读, 5 评论, 收藏, 编辑 微软发布Visual Studio 2012 RC和Wind ...
- LIBTOOL is undefined 问题的解决方法
configure.ac:10: error: possibly undefined macro: AC_PROG_LIBTOOL If this token and others are legit ...