专栏首页Happy的分享为什么阿里规约手册要求谨慎使用Arrays.asList方法

为什么阿里规约手册要求谨慎使用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,那么是很容易埋下生产隐患的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 你知道HTTP协议的ETag是干什么的吗?

    在HTTP1.1规范中,新增了一个HTTP头信息:ETag。对于普通开发者来说,可能平时真的不会接触到该HTTP头。平时接触不到或者说用得少,不代表这个请求头不...

    Happyjava
  • 【快学springboot】1.快速创建springboot项目

    IDEA专业版默认集成了此工具,eclipse或者vs code等可以自行搜索安装。如果不希望安装此插件,也可直接通过官网创建spring boot项目,然后下...

    Happyjava
  • Java8新特性——Optional

    在开发中,我们常常需要对一个引用进行判空以防止空指针异常的出现。Java8引入了Optional类,为的就是优雅地处理判空等问题。现在也有很多类库在使用Opti...

    Happyjava
  • 一日一技:让Tmux完美支持鼠标,不记忆任何快捷键(仅限macOS)

    Tmux是一个非常有名的终端复用工具,可以方便地让我们在一个终端里面分多个窗口。如下图所示:

    青南
  • PIL学习笔记(一)

    Oceanlong
  • 面试热点|理解TCP/IP传输层拥塞控制算法

    这是TCP/IP协议栈系列的第二篇文章,之前的一篇理解TCP/IP协议栈之HTTP2.0感兴趣可以看下,今天一起来学习下一个热点问题。

    云爬虫技术研究笔记
  • Python 爬虫简单验证码识别和抓包

    Python知识大全
  • 论linux下计划任务

    小伙伴们,平时做程序开发的时候,是否也曾为实现一个商城网站或者一个小程序自动执行某个方法而苦恼呢?

    思梦php
  • CNN结构模型一句话概述:从LeNet到ShuffleNet

    十四君
  • 小项目里面的大内涵

    额~因为我从没系统的看过,所以实施的时候总是出这样那样的语法问题,尤其是对 ‘ “ . ` 这些个符号的使用,非常混乱~

    libo1106

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动