当前位置:   article > 正文

为什么阿里巴巴Java开发规范中建议谨慎使用 Arrays.asList() 方法_java arrays.aslist 性能怎么样

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异常

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

二、数据共享和潜在问题

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

三、不支持扩容

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

四、API 使用的混淆性

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

五、最佳实践

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/982234
推荐阅读
相关标签
  

闽ICP备14008679号