为什么阿里巴巴Java开发规范中建议谨慎使用 Arrays.asList() 方法

一、不可变性:

        当执行 Arrays.asList(T... a) 方法时,它会返回一个固定大小的列表实现(java.util.Arrays.ArrayList 类的一个实例),该类继承自 AbstractList,但并没有重写 add()remove() 等修改方法。因此,当你尝试调用这些方法时,会抛出 UnsupportedOperationException 异常。

根据以上可以看出Arrays.asList()方法返回的是Arrays的内部类ArrayList并且没有重写AbstractList的add、remove等方法,直接使用的是AbstractList中默认的方法,而AbstractList中add、remove方法直接抛出了UnsupportedOperationException异常

String[] array = {"a", "b", "c"};
List<String> list = Arrays.asList(array);
list.remove(0); // 这将抛出 UnsupportedOperationException
list.add("d"); // 这将抛出 UnsupportedOperationException

二、数据共享和潜在问题

        返回的列表与其基于的数组共享数据,这意味着对列表元素的修改会影响到原始数组。尽管不是所有修改操作都会抛出异常(如通过 set(index, element) 修改已有元素),但在并发环境下,如果多个线程同时读写,可能会引发难以预料的问题,例如并发修改异常(ConcurrentModificationException)。

三、不支持扩容

        因为它是固定大小的,所以在需要动态增加或减少元素数量的情况下,直接使用 Arrays.asList() 创建的列表无法满足需求。

四、API 使用的混淆性

        开发者可能误以为返回的是标准的、可变的 ArrayList 对象,并在代码中进行添加或删除操作,从而导致运行时错误。

五、最佳实践

        如果确实需要一个可变的 List,应该先转换为 List 视图,然后创建一个新的 ArrayList 或其他可变集合对象。这不仅确保了集合的可变性,还避免了与底层数组的数据共享问题。

String[] array = {"a", "b", "c"};
List<String> mutableList = new ArrayList<>(Arrays.asList(array));
mutableList.add("d"); // 此时不会抛出异常,因为这是一个真正的 ArrayList 实例

综上所述,阿里巴巴Java开发规范强调了在开发过程中应明确理解并合理运用 API 的特性,以提高代码质量和稳定性。对于 Arrays.asList(),因其固有的不可变性和潜在的混淆性,规范建议开发者谨慎使用,并根据实际场景选择合适的集合类型。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值