在
java.util.
Arrays中有一个名为“ArrayList”的私有静态类.
它只是从Arrays.asList方法引用.
它只是从Arrays.asList方法引用.
这样做的好处是什么?
为什么不引用java.util.ArrayList?
代码如下:
/** * @serial include */ private static class ArrayList<E> extends AbstractList<E> implements RandomAccess,java.io.Serializable
解决方法
What is the benefit of doing this? Why is
java.util.ArrayList
not referred instead?
一个原因是实际实现类不是公共API细节.这样做意味着他们可以在将来更改实施类,而不会有破坏客户代码的风险.
这样做的另一个原因是这个私有类对ArrayList实现了一些不同的操作.特别是涉及更改列表大小的操作需要实现以引发异常,以便符合Arrays.asList(…)方法的javadocs中指定的行为.
实际上,Arrays.asList(…)返回的列表是原始数组的包装器,而不是一个完整的功能列表.这有优点和缺点:
>在下行方面,某些操作不起作用.
>最重要的是,创建包装器比从数组中创建一级列表便宜得多. (后者需要将数组内容复制到列表中),而对于大型数组来说这将是昂贵的.)
另外,存在通过包装器(或反之亦然)可以看到原始数组的更改的问题,如果这是您所需要的,则可能会很有用.
你在这个评论中问过:
a) Why return non resizable list?
因为返回常规可调整列表需要在某个时候复制数组内容…这是昂贵的. (如果执行延迟复制,直到执行大小更改操作,原始数组和列表之间的关系将很难理解,请考虑…)
b) Why not use Collections.unmodifiableList and pass the java.util.ArrayList object?
那没有任何事情.您仍然必须将数组内容复制到ArrayList.这个“奇怪”行为规范的全部要点是避免复制.