β

array 与 ArrayList 之间的区别

千里草 71 阅读

原文(需要翻墙): http://javarevisited.blogspot.com.au/2016/01/9-difference-between-array-vs-ArrayList-in-java.html
上面链接打不开的可以访问本地保存的html查看原文: http://7fvfrr.com1.z0.glb.clouddn.com/9%20difference%20between%20Array%20vs%20ArrayList%20in%20Java.html :

array ArrayList 两者都是 Java 中重要的数据结构, 在Java程序中运用非常频繁, 尽管 ArrayList 内部是由一个 array 实现的, 但是知道 array ArrayList 之间的区别是成为一个优秀的java 开发者的关键. 如果你知道 array ArrayList 的相似点和不同点, 就可以明智的选择什么时候用 array 胜过 ArrayList 或者反之. 在这片文章里, 我会帮助你们认识java中 array ArrayList 的不同. 如果你具有C 或者C++的背景知识那么你已经知道 array 在编程的世界里是最有用的数据结构之一. array 提供 O(1)的查找性能和很基本的方式去存储数据.

ArrayList 是Java集合框架类的一员,可以称它为一个动态数组. array 是静态的,所以一个数据一旦创建就无法更改他的大小, 所以, 如果需要一个数组可以重新定义他的大小,你应该使用 ArrayList , 这是 array ArrayList 的基本的不同.

在java面试中, array ArrayList 的区别是众多问题中常被问到的一个面试题, 所以如果你准备寻找下一份工作, 知道这些细节也许会对你有用. 你也可以从 Java Programming Interview Exposed 书中的各种问题中学到很多, 一本最为适合java开发者找工作面试而准备的书之一.

### array vs ArrayList in Java 通过一些点来比较两个不同的事情是最好的方式, 这样会使大家容易理解他们的不同点. 所以让我们来看看有哪些点能够让我们比较 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 自动为我们做的.你可以从我的文章里学到更多关于从 ArrayList 里删除对象 difference between clear() and removeAll()

5) Primitives 基本类型

如果你第一次开始使用Arraylis,你会发现,你不能保存基本类型到 ArrayList 里,这是 array ArrayList 一个关键的不同,因为 array 既可以保存对象也可以保存基本类型.例如.int[]数组是合法的,但是一个int型的 ArrayList 是不合法的. 如何解决这个问题呢? 假设你想存储int类型到 ArrayList 里,你会怎么做呢? 是的,你可以用封装类,这就是封装类被引进java的原因之一.所以,从java5开始,这个区别越来越不明显了,因为通过自动封装你会发现``ArrayList .add(21) 是非常合法并且运行正常.

6) Generics 泛型

ArrayList array 之间的另外一个重要的区别就是前者能够显示的支持泛型,后者不行.由于数组是协变性的,所以你可以在 array 上使用泛型( Since an array is of covariant type, you can use Generics with them ).这个表示编译器不可能检查 array 的类型安全,但是可以校验类型安全.当你要写一个类型安全的类的时候如何解决这个问题呢?好吧,你可以用里展示的技术,通过申明一个类似于E[]的数组,然后后期进行类型转换.

7) Iteration 迭代

ArrayList 提供比 array 更多的方式来迭代一个接一个的访问所有的元素.可以通过for,while等循环来遍历 array ,但是你可以通过 Iterator ListIterator 类来遍历 ArrayList .看 这里 来了解更多的遍历 ArrayList 的方式.

8) Supported Operations 支持的操作

由于 ArrayList 的内部是由一个 array 支撑着,所以它暴露了能够在 array 可能支持的操作,并且还提供了它动态的属性.它也支持添加操作,这是在 array 上不可能的.你可以同时在 array ArrayList 上存储元素,但是仅 ArrayList 允许你删除元素.然而你可以通过模拟将null赋值到对应的index里来模拟删除.这个模拟不会像是删除,除非你同时将所删除元素对应的索引(index)移动到下一级

ArrayList array 头提供取元素的方法.例如 ArrayList 用索引通过get()方法来获取一个元素, version[0]将会返回 array 的第一个元素. ArrayList 也提供一个方法来清空和重用例如, clear() removeAll() . array 并不提供那些方发,但是你可以通过循环这个数组来将null赋值到所有的元素里来模拟 ArrayList removeAll()

9) Size() vs length 大小 vs 长度

array 仅仅提供一个 length 属性来告诉你 array 里有多少个插槽,例如可以存储多少个元素.它没有提供任何方法来告诉你哪些插槽是满的,哪些是空的.例如,当前元素的个数.但是 ArrayList 提供一个 size() 方法来告诉你当前时间点 ArrayList 存储了多少个元素. size() 总是和 length 不同的,它也是 ArrayList 的容量.如果你想知道更多关于这个的知识,我建议你阅读这篇文章文章 array length vs ArrayList Size in Java

10) Dimension 维度

ArrayList array 的另外一个重要的区别就是 array 可以使多维度的.例如,你可以设置一个二维数组或者三维数组.可以使你创在一个特殊的数据结构来代表矩阵或者2D形式( terrains ),另一方面, ArrayList 并不支持允许你指定维度.请参见 这个指导 来学习更多关于如何在Java里使用多维度的数组.

这里是列出了所有 ArrayList array 的重要区别 difference

Similarity between array and ArrayList array ArrayList 的相似点

目前为止你已经掌握 ArrayList array 的区别,现在让我们集中他们的一些相似之处,由于 ArrayList 内部使用的是 array ,他们必然有很多相似之处,例如:

1) Data Structure 数据结构

两者都允许你存数对象,并且所有的都是基于index的数据结构,提供O(1)的复杂度来获取一个元素,但是如果通过 二分查找 来查询某个元素依旧需要log(N)的复杂度.

2) Order 顺序(没太理解这句话的意思)

Both array and ArrayList maintains order on which elements are added into them. ( array ArrayList 都保持着元素的顺序?)

3) Search 查找

你可以通过index来查找一个元素,这个是O(1)的时间复杂度,除此之外如果你的 array 不是排好序的数组你可以用线性的查找,这个将消耗大约O(n)的时间复杂度,或者你可以将数组排序后使用二分查找,这个将消耗排序的时间复杂度加上O(logN)

4) Null values 空值

array ArrayList 都允许存储null值,但请记住只有object的 array 可以这样,基本类型的数组会存储他们的默认值,例如int型的数组默认存储0,boolean的数组默认存储false.

5) Duplicates 重复

array 和Arraylis都允许存储重复的值,

6) Performance 性能

ArrayList 模仿 array 的性能,例如O(1)复杂度的访问元素如果你知道这个元素的index,但是 ArrayList 会消耗更多的内存,因为它是存储的对象,并且持有了而外的数据来自动更改 ArrayList 的长度.

7) Zero-based Index

这些就是关于 array ArrayList 的所有不同点啦,其中你需要记住的最重要的不同点就是 array 是静态的,你无法一旦创建了一个数组就无法更改它的大小,但是 ArrayList 因为是动态的,所以它可以做到.根据这个不同点,如果你事先知道数组的长度,并且确定它的大小不会改变,你应该使用 array ,否则请使用 ArrayList

作者:千里草
一个养了一只名叫大白的猫的程序猿的博客.
原文地址:array 与 ArrayList 之间的区别, 感谢原作者分享。