(Java8)源代码中ArrayList的多个实现之间有什么区别

(Java8)源代码中ArrayList的多个实现之间有什么区别,java,arraylist,java-8,Java,Arraylist,Java 8,我试图理解Java8中的Streams,偶尔我在Java8的源代码中偶然发现了一件有趣的事情:ArrayList似乎实现了两次: 显而易见的一个:java.util.ArrayList 不明显的一个:java.util.Arrays.ArrayList,它是一个私有类 一个奇怪的区别是,普通版本要大得多,并且实现了List,而Arrays.ArrayList不直接实现 为什么要定义两次?为什么使用相同的名称呢?实际上,自从Arrays.asList()引入以来,它就一直存在。数组的Array

我试图理解Java8中的
Stream
s,偶尔我在Java8的源代码中偶然发现了一件有趣的事情:
ArrayList
似乎实现了两次:

  • 显而易见的一个:
    java.util.ArrayList

  • 不明显的一个:
    java.util.Arrays.ArrayList
    ,它是一个私有类

一个奇怪的区别是,普通版本要大得多,并且实现了
List
,而
Arrays.ArrayList
不直接实现


为什么要定义两次?为什么使用相同的名称呢?

实际上,自从
Arrays.asList()
引入以来,它就一直存在。数组的ArrayList是底层数组的视图。如果数组被更改,ArrayList将生效,反之亦然


主要的好处是,不需要额外的空间,因为它不会将数组复制到新对象(ArrayList),也不需要额外的时间来复制元素。

这在Java 8中并不新鲜-另请参见:这些类恰好共享相同的名称,但不应该履行相同的角色。
private
类是
Arrays
中的一个实现细节,它提供了数组的
列表
视图。它可以被称为
ArrayViewList
或其他什么,也许假装它是有助于理解。