最好在某些点上对比两者,这更易于理解。因此,让我们看一下Array与ArrayList有哪些区别吧。
1、Implementation
数组是基础编程组件或数据结构,但ArrayList是 Java Collections框架(一个 API)中的类。实际上,ArrayList是使用Java中的数组在内部实现的。因为ArrayList是一个类,所以它拥有类的所有属性,例如,您可以创建对象和调用方法,但是 Array是 Java中的对象,它不提供任何方法。它只提供一个公开的length属性来为您提供数组的长度,并且它长度是固定的。
2、性能
由于ArrayList基于数组,因此一定程度上两者性能相当。在某种程度上确实如此,但是由于ArrayList提供了额外的功能,因此 ArrayList和数组的性能存在一些差异,主要是在内存使用和CPU时间方面。对于基于索引的访问,ArrayList和array均提供O(1)性能,但是如果添加新元素会触发调整大小,则添加在ArrayList中可以为O(logN),因为这涉及在后台创建新数组从旧数组中复制元素到新的数组。ArrayList中的内存需求也不仅仅是用于存储相同数量对象的数组,例如int[]与ArrayList中相比,int[]存储20个int变量所需的内存更少,这是因为ArrayList和wrapper类的对象元数据开销很大。
3、类型安全性
ArrayList是类型安全的,因为它支持泛型,泛型允许编译器检查ArrayList中存储的所有对象的类型是否正确。另一方面,数组不支持 Java中的Generic。这意味着无法进行编译时检查,但是如果您尝试将不正确的对象存储到数组中(例如:将字符串存储到int数组中),则 array通过引发ArrayStoreException来提供运行时类型检查。
4、通用
简而言之,ArrayList比普通的数组分散更灵活,因为它是动态的。它可以在需要时自行增长,而Array布局则无法实现。ArrayList 中还允许您删除 Array无法实现的元素。通过删除,我们的意思不仅是将零分配给相应的索引,还意味着将其余元素向下复制一个索引,而ArrayList 中会自动为您完成。
5、基础数据类型
如果您首先开始使用ArrayList,那么您将无法在ArrayList上存储基本数据类型。这是array 和 ArravList之间的关键区别,因为array允许存储基本数据类型和对象。
例如,int[]数组有效,但int的 ArravList无效。您如何处理这个问题?假设您想将int基本数据类型存储到ArrayList中,那又如何呢?好了,在 Java中您可以使用包装器类。因此,如果您只想将int 2存储到ArrayList中,其余的操作将由自动装箱完成。顺便说一句,由于自动装箱,这种差异从 Java5开始并不明显,因为您会看到ArrayList.add(21)完全有效并且可以正常工作。
6、泛型
ArrayList和 Array 的另一个重要区别是,前者支持Generic,而后者不支持Generic。由于数组是协变类型的,因此可以将泛型与它们一起使用。这意味着编译器不可能在编译时检查数组的类型安全性,但他们可以验证Array 的类型安全性。那么在用 Java编写类型安全的类时如何处理这个问题呢?好了,您可以查看《Effective Java》中内容,在其中可以声明一个像E[]这样的数组,然后使用类型转换。
7、迭代性
ArrayList提供了更多的迭代方式,即Array只能通过循环索引一一访问所有元素。例如:针对循环的增强和 do-while来遍历数组,但ArrayList还可以使用Iterator 和 ListIterator 类来遍历。
8、支持的操作
由于ArrayList在内部由数组支持,因此它公开了Array可能执行的操作,但是鉴于其动态特性,它还没有添加Array无法执行的操作,例如,您可以将元素存储在array和ArrayList 中,但是只有ArrayList 允许您删除元素。尽管您可以通过将null分配给相应的索引来模拟数组,但是除非您也将数组中该索引上方的所有元素都向下移动一级,否则它不会删除。
ArrayList 和Array都提供了检索元素的方法,例如ArrayList 的 get()方法使用索引从数组中获取元素,例如,Array [0]将返回第一个元素
ArrayList还提供了清除和重用的操作,例如clear()和removeAll(),Array不提供该操作,但是你可以循环遍历Array并为每个索引分配null 以模拟它。
9、size()与length
数组仅提供一个length属性,该属性告诉您数组中的插槽数,即可以存储多少个元素,它不提供任何方法来找出已填充的元素数和多少个插槽为空,即元素。尽管ArrayList确实提供了size()方法,该方法告诉给定时间点存储在ArrayList中的对象数量。size()始终与length不同,这也是ArrayList 的容量。
10、维度
Array和ArrayList之间的另一个显著区别是,数组可以是多维的,例如,您可以具有二维数组或三维数组,这使其可以表示矩阵和2D地形的非常特殊的数据结构。
Array和 ArrayList之间的相似性
到目前为止,您已经看到了ArrayList和Array之间的区别,现在让我们集中讨论一些相似之处。由于ArrayList在内部使用数组,因此必然有很多相似之处,如下所示:
1、数据结构
两者都允许您使用Java存储对象,并且彼此都是基于索引的数据结构,可提供O(1)性能来检索元素,但是,如果对数组进行了排序和使用了二进制搜索算法,则没有索引的搜索仍然是log(N)算法。
2、顺序
Array和 ArrayList都保持将元素添加到其中的顺序。
3、搜索
您可以使用索引搜索元素,即O(1),否则,如果数组未进行排序,则可以使用线性搜索,这大约需要O(n)的时间,也可以在Java中对数组进行排序后使用二进制搜索,这正在排序+ O(logN)。
4、空值
数组和ArrayList都允许空值,但请记住只有对象数组允许空基本数据类型数组,它们不存储基本数据类型的默认值。例如:int类型的0与 boolean类型的false 。
5、复制
array和ArrayList都允许复制。
6、性能
ArrayList模拟数组的性能,例如,如果您知道索引,则可以进行O(1)访问,但是它具有额外的内存开销,因为它是一个对象,并且还拥有其他数据以自动调整ArrayList的大小。
7、从零开始的索引
array和 ArrayList 都有从零开始的索引,即第一个元素从第零个索引开始
这就是 Java中数组与ArrayList之间真正的区别的全部。您应该记住的最重要的区别是,Array本质上是静态的,即创建后就无法更改其大小,但是ArrayList是动态数组,如果ArrayList中的元素数大于其阙值,则可以调整自身大小。基于这种差异,如果预先知道大小并确定它不会改变,则应该使用数组作为数据结构来存储对象;如果不确定,则只需使用ArrayList。
Was this helpful?
0 / 0