array vs ArrayList in Java (Java中array和ArrayList的比较)
通过一些点来比较两个不同的事情是最好的方式,这样会使大家容易理解他们的不同点。所以让我们来看看有哪些点能够让我们比较array 和ArrayList。
▶1) Implementation(实现)
array 是本地的程序设计组件或者数据结构,但是ArrayList是一个来自Java集合类的类,一个接口 (Application programming interface)。
实际上,ArrayList 在Java上,它的内部是由一个array实现的。既然ArrayList是一个类,所以它持有了所有类的属性。例如:你可以创建对象,可以调用方法,但array并不提供任何方法,它仅仅暴露了一个常量的长度来表示当前数组的长度。
▶2) Performance(性能)
既然ArrayList是基于array,所以你可能会认为它提供和array一样的性能。 这个假设在一定程度上是成立的,但是在一些额外功能性的ArrayList上性能还是和array 存在一定差别,主要是内存的使用和CPU 耗时。
在索引上,ArrayList和array都能提供O(1)的时间复杂度,但是在添加item的时候如果出发resize,ArrayList可能会是O(logN)的时间复杂度,因为它包含了创建一个新的array 和将老的array的数据拷贝到新的array里。
在存储相同数量的对象时,ArrayList所需要的内存也是比array大的。例如:一个int[]的数组会比ArrayList节省20个int 变量的大小,因为对象的基本数据会在ArrayList和包装类上进行开销。
▶3) Type Safety(类型安全)
ArrayList 是类型安全的,因为它支持泛型(Generics) 允许编译器检查 ArrayList 里所包含的对象是否是正确的类型。
然而,array 并不支持泛型。这代表在编译时期检查array 所保存对象的类型是不可能的,但是array 通过抛出 ArrayStoreException 异常的方式来进行运行时的类型检查如果你存储了一个错误类型的对象。例如:存储一个String 到 int array 里。
▶4) Flexibility(灵活性)
灵活性是区分array 和 ArrayList最重要的一个东西,简单来说,ArrayList比简单的array要灵活的多,因为ArrayList 是动态的,它可以在需要的时候扩大自己的内存,这是一个 array 不可能做到的。
ArrayList 也允许你删除元素,这在array上也是不可能的。通过删除,我的意思并不是将null置于对应的index里,而是将所删除元素的后面所有元素的index都往前移动一位,这些都是ArrayList自动为我们做的。
你可以从我的文章[difference between clear() and removeAll()]里学到更多关于从ArrayList里删除对象
▶5) Primitives(基本类型)
如果你第一次开始使用Arraylis,你会发现,你不能保存基本类型到ArrayList里。这是array和ArrayList一个关键的不同,因为array既可以保存对象也可以保存基本类型。
例如:int[]数组是合法的,但是一个int型的ArrayList是不合法的。
如何解决这个问题呢? 假设你想存储int类型到ArrayList里,你会怎么做呢? 是的,你可以用封装类,这就是封装类被引进java的原因之一。
所以,从java5开始,这个区别越来越不明显了,因为通过自动封装你会发现“ArrayList.add(21)”是非常合法并且运行正常。