Array和ArrayList都是Java中两个重要的数据结构,在Java程序中常用。而且ArrayList在内部由Array支持,了解Java中的Array和ArrayList之间的差别对于成为一名优秀的Java开发人员也相当重要。java
另外一方面 ,ArrayList是Java Collection框架中的一个类,它是做为动态数组引入的。因为数组本质上是静态的,即一旦建立后就没法更改数组的大小,所以,若是须要一个能够调整自身大小的数组,则应使用ArrayList。这是Array和ArrayList之间的根本区别。程序员
它也是Java面试中常常问到的问题之一,若是您正在为下一份工做作准备,那么了解这些详细信息可能真的颇有用。面试
最好在某些点上对比二者,这更易于理解。所以,让咱们看一下能够Array与ArrayList有哪些区别吧。算法
数组是基础编程组件或数据结构,但ArrayList是Java Collections框架(一个API)中的类。实际上,ArrayList是使用Java中的数组在内部实现的。由于ArrayList是一个类,因此它拥有类的全部属性,例如,您能够建立对象和调用方法,可是Array是Java中的对象,它不提供任何方法。它只提供一个公开的length属性来为您提供数组的长度,而且它长度是固定的。编程
因为ArrayList基于数组,所以必定程度上二者性能至关。在某种程度上确实如此,可是因为ArrayList提供了额外的功能,所以ArrayList和数组的性能存在一些差别,主要是在内存使用和CPU时间方面。对于基于索引的访问,ArrayList和array均提供O(1)性能,可是若是添加新元素会触发调整大小,则添加在ArrayList中能够为O(logN),由于这涉及在后台建立新并数组从旧数组中复制元素到新的数组。ArrayList中的内存需求也不只仅是用于存储相同数量对象的数组,例如int[]与ArrayList中相比,int[] 存储20个INT变量所需的内存更少,这是由于ArrayList和wrapper类的对象元数据开销很大。数组
ArrayList是类型安全的,由于它支持泛型,泛型容许编译器检查ArrayList中存储的全部对象的类型正确正确。替换,但数组不支持Java中的Generic。这意味着没法进行编译时检查,可是若是您尝试将不正确的对象存储到数组中(例如:将字符串存储到int数组中),则array经过引起ArrayStoreException来提供运行时类型检查。安全
简而言之,ArrayList比普通的数组分散更灵活,由于它是动态的。它能够在须要时自行增加,而Array布局则没法实现。ArrayList中还容许您删除Array没法实现的元素。经过删除,咱们的意思不只是将零分配给相应的索引,还意味着将其他元素向下复制一个索引,而ArrayList中会自动为您完成。数据结构
若是您首先开始使用ArrayList,那么您将没法在ArrayList上存储基元。这是array和ArrayList之间的关键区别,由于能够提供_存储基本类型和对象_。例如,int []数字有效,但int的ArrayList无效。您如何处理这个问题?假设您想将int原语存储到ArrayList中,那又如何呢?好了,在Java中您可使用包装器类。所以,若是您只想将int 2存储到ArrayList中,其他的操做将由自动装箱完成。顺便说一句,因为自动装箱,这种差别从Java 5开始并不明显,由于您会看到ArrayList.add(21)彻底有效而且能够正常工做。app
ArrayList 和 Array的另外一个重要区别是,前者支持Generic,但者来不支持Generic。因为是协变类型的,所以能够将泛型与它们一块儿使用。这意味着编译器不可能在编译时检查数组的类型安全性,但他们能够验证Array的类型安全性。那么在用Java编写类型安全的类时如何处理这个问题呢?好了,您能够查看《Effective Java》中内容,在其中能够声明一个像E []这样的副本,而后使用类型转换。框架
ArrayList提供了更多的迭代方式,即Array只能经过循环索引一一访问全部元素。例如:针对循环的加强和do-while来遍历数组,但ArrayList还可使用Iterator和ListIterator类来遍历。
因为ArrayList在内部由数组支持,所以它公开了Array可能执行的操做,可是鉴于其动态特性,它尚未添加Array没法执行的操做,例如,您能够将元素存储在array和ArrayList中,可是只有ArrayList容许您删除元素。虽然您能够经过分配null使用数组来模拟到相应的索引,除非将多个中间该索引上方的全部元素都向下移动一级,不然它不会像删除。
ArrayList和Array都提供了检索元素的方法,例如ArrayList的get()方法使用索引从数组中获取元素,例如,Array[0]将返回第一个元素
。ArrayList还提供了清除和重用的操做,例如clear()和removeAll(),Array不提供该操做,可是您能够循环遍历Array并为每一个索引分配null以模拟它。
数组仅提供一个length属性,该属性告诉您数组中的插槽数,便可以存储多少个元素,它不提供任何方法来找出已填充的元素数和多少个插槽为空,即元素。尽管ArrayList确实提供了size()方法,该方法告诉给定时间点存储在ArrayList中的对象数量。size()始终与length不一样,这也是ArrayList的容量。
数组和数组列表之间的另外一个显着区别是,数组能够是多维的,例如,您能够具备二维数组或三维数组,这能够表示矩阵和2D地形的很是特殊的数据结构。
到目前为止,您已经看到了ArrayList和副本之间的区别,如今让咱们集中讨论一些类似之处。因为ArrayList在内部使用数组,所以必然有不少类似之处,以下所示:
二者都容许您将对象存储在Java中,而且彼此都是基于索引的数据结构,可提供O(1)性能来检索元素,可是,若是对进行了排序和使用了二进制搜索算法,则没有索引的搜索仍然是LOG(N) 。
Array和AArrayList都保持将元素添加到其中的顺序。
您可使用索引搜索元素,即O(1),不然,若是未对片断进行排序,则可使用线性搜索,这大约须要O(n)的时间,也能够在对进行进行排序后使用二进制搜索Java,这是排序+ O(logN)。
这两个数组和ArrayList容许空值,但请记住只有对象数组容许其存储为空,原始类型不能为空,原始类型为使用默认值。例如:int类型的0与 boolean类型的false 。
array和ArrayList都容许复制。
ArrayList模拟数组的性能,例如,若是您知道索引,则能够进行O(1)访问,可是它具备额外的内存开销,由于它是一个对象,而且还拥有其余数据以自动调整ArrayList的大小。
array和ArrayList都有从零开始的索引,即第一个元素从第零个索引开始。
这就是Java中数组与ArrayList之间真正的区别的所有。您应该记住的最重要的区别是,Array本质上是静态的,即建立后就没法更改其大小,可是ArrayList是动态数组,若是ArrayList中的元素数大于其阈值,则能够调整自身大小。基于这种差别,若是预先知道大小并肯定它不会改变,则应该使用数组做为数据结构来存储对象;若是不肯定,则只需使用ArrayList。
“不积跬步,无以致千里”,但愿将来的你能:有梦为马 随处可栖!加油,少年!
关注公众号:「Java 知己」,天天更新Java知识哦,期待你的到来!