赞
踩
一、不可变性:
当执行 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()
,因其固有的不可变性和潜在的混淆性,规范建议开发者谨慎使用,并根据实际场景选择合适的集合类型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。