java.util.Arrays$ArrayList
(下文:Arrays$ArrayList
)是java.util.Arrays
的私有静态内部类,他实现的接口,继承的父类几乎和java.util.ArrayList
(下文:ArrayList
)相同,既然是私有的,那么平常应该是我们少关注的地方。本文尝试对比一两个他们之间的不同点。
使用场景对比
构造拥有三个字符串的List
,
ArrayList
Arrays$ArrayList
两者都满足了需求,后者看起来比前者简洁,除此之外两者还有什么不同呢。
增加删除操作对比
支持的操作,
不支持的操作,这将会抛出异常java.lang.UnsupportedOperationException
可见Arrays$ArrayList
不允许增加也不允许删除。
具体的add方法
在Arrays$ArrayList
类,
首先并没有override父类的add
方法,所以这个方法来自他的父类AbstractList
;
看AbstractList
中的add
方法
最终调用的方法抛出了异常UnsupportedOperationException
。
相比较ArrayList
这两个方法都在ArrayList
中实现了,或者扩容然后在尾部插入,或者扩容、移动数组元素,然后插入到指定的下标位置。
具体的remove方法
Arrays$ArrayList
的remove(Object)
方法继承自AbstractList
的父类AbstractCollection
,其中
这里使用了迭代器的方式进行删除,看这个方法的注释
如果这个迭代器没有实现remove
方法的话,那么这整个方法也将要抛出UnsupportedOperationException
异常的。
在AbstractCollection
中iterator
是一个抽象方法,之于Arrays$ArrayList
,这个方法实现的位置还是在AbstractList
,
到这里我们发现AbstractList
实现了AbstractCollection
的iterator
方法,而且返回的迭代器也实现了remove
方法,不是上文提到的注释那种情况。但是为什么删除动作还是不允许的呢?
具体这个迭代器的remove
方法,
可见迭代器最终也是调用容器类的remove
方法的,那么Arrays$ArrayList
没有实现remove
方法,而AbstractList
的remove
方法,如下
因此,即使在AbstractList
中使用迭代器进行删除操作,但由于Arrays$ArrayList
没有实现remove
且继承的remove
抛出UnsupportedOperationException
异常,最终在Arrays$ArrayList
是不允许删除操作的。
值得注意的是,AbstractList
的迭代器是否要调用remove(int)
方法是由要删除的目标是否数组的元素决定的,如果不存在这样的元素,则下面的代码并不会出现异常,