ArrayList 内部是由一个array 实现的。

如果你知道array 和 ArrayList 的相似点和不同点,就可以选择什么时候用array 或者使用ArrayList , array 提供 O(1)的查找性能和很基本的方式去存储数据。

ArrayList 是Java集合框架类的一员,可以称它为一个动态数组。array 是静态的,所以一个数据一旦创建就无法更改他的大小。

所以, 如果需要一个数组可以重新定义他的大小,你应该使用 ArrayList, 这是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自动为我们做的。

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的类型安全,但是可以校验类型安全。

当你要写一个类型安全的类的时候如何解决这个问题呢?好吧,你可以用《Effective Java》里展示的技术,通过申明一个类似于E[]的数组,然后后期进行类型转换。

7) Iteration(迭代)

ArrayList 提供比array更多的方式来迭代,即可以允许一个接一个的访问所有的元素。

可以通过for、while等循环来遍历array,但是你可以通过Iterator 和ListIterator类来遍历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的容量。

10) Dimension(维度)

ArrayList和array的另外一个重要的区别就是array可以使多维度的。如你可以设置一个二维数组或者三维数组,可以使你创在一个特殊的数据结构来代表矩阵或者2D形式(terrains)。

另一方面,ArrayList并不支持允许你指定维度。

相似点:

1) Data Structure(数据结构 )

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

2) Order(顺序)

array 和ArrayList在添加元素时都维持着元素的顺序。(Both array and ArrayList maintains order on which elements are added into them. )

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吧。

java数据结构--array与ArrayList的区别的更多相关文章

  1. Java-杂项: Java中Array和ArrayList区别

    ylbtech-Java-杂项: Java中Array和ArrayList区别 1.返回顶部 1. 1)精辟阐述:可以将 ArrayList想象成一种“会自动扩增容量的Array”. 2)Array( ...

  2. Java面试题之Array和ArrayList的区别

    Array和ArrayList的区别: 1.Array类型的变量在声明的同时必须进行实例化(至少得初花数组的大小),而ArrayList可以只是先声明: 2.Array始终是连续存放的:而ArrayL ...

  3. Array和ArrayList的区别与联系

    博主今天去了一个java的实习面试,发现有好多java最基础的数据结构对于博主来说反而感到陌生,在面试官问一些常见的例如HashMap这样的数据结构,博主能回答的头头是道,但是在问到Array和Arr ...

  4. Java中Array与ArrayList的10个区别

    Array和ArrayList都是Java中两个重要的数据结构,在Java程序中经常使用.并且ArrayList在内部由Array支持,了解Java中的Array和ArrayList之间的差异对于成为 ...

  5. java中Array和ArrayList区别

    1)精辟阐述:可以将 ArrayList想象成一种“会自动扩增容量的Array”. 2)Array([]):最高效:但是其容量固定且无法动态改变:     ArrayList:  容量可动态增长:但牺 ...

  6. 【Java集合的详细研究5】Java中Array与ArrayList的主要区别

    1)精辟阐述:可以将 ArrayList想象成一种“会自动扩增容量的Array”. 2)Array([]):最高效:但是其容量固定且无法动态改变:     ArrayList:  容量可动态增长:但牺 ...

  7. Java中Array与ArrayList的主要区别

    1)精辟阐述: 可以将 ArrayList想象成一种"会自动扩增容量的Array". 2)Array([]):最高效:但是其容量固定且无法动态改变:      ArrayList: ...

  8. Java中Vector和ArrayList的区别

    首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个具体 ...

  9. java数据结构之列表——ArrayList,LinkedList,比较

    刚看完<数据结构与算法分析java语言描述>的第3章中的表,下面回忆下主要知识点,主要说明各列表之间的关系,以及各自的优缺点.其中牵涉到内部类和嵌套类. 1 Collection APIp ...

随机推荐

  1. asp.net mvc中用 log4net记录日志到数据库中

    1.log4net官网配置相关,创建数据库 http://logging.apache.org/log4net/release/config-examples.html CREATE TABLE [d ...

  2. java:LeakFilling(Springmvc)

    1.后台可以同时多个对象接收前端页面的值:(如图两个都打印了) 2.参数绑定的注解,通过该注解可以解决参数名称与controller中形参名称不一致的问题: @RequestParam(name=&q ...

  3. mybatis整合spring,使用org.mybatis.spring.mapper.MapperScannerConfigurer扫描出现问题

    <!-- 加载配置文件 --> <context:property-placeholder location="classpath:db.properties" ...

  4. Scratch少儿编程系列:(十一)Scratch编程之简单见解

    一.Scratch官网的说明     With Scratch, you can program your own interactive stories, games, and animations ...

  5. 【Ruby on Rails 学习五】Ruby语言的方法

    1.方法的调用 2.自定义方法 3.带默认值的自定义方法 4.带返回值的自定义方法 方法或者说是函数,实际上是包含了一段代码,去执行某一个特定的过程. def add(a=3,b=2) return ...

  6. Windows 下 C/C++ 多线程编程入门参考范例

    #include <windows.h> #include <iostream> using namespace std; DWORD WINAPI myThread(LPVO ...

  7. [转帖]目标管理的S.M.A.R.T.理念

    目标管理的S.M.A.R.T.理念 https://blog.csdn.net/gehantao/article/details/1593510     目标管理(MBO)是一种管理战略,它使用的是S ...

  8. Android Studio 如何获取 text文本内容

    1.找到目录的main先建立assets格式的文件夹 2.再把需要读取的txt 文件放入到该文件夹下(名字随意),这里取 list.txt. 文件内容 格式如下 3.读取文本内容 工具代码 /** * ...

  9. Java作业 题目:16版.情人节送玫瑰花

    题目:16版.情人节送玫瑰花 题干: 1.实验要求 本实验要求:以情人节送花为业务背景,体验自定义异常以及异常处理机制. 1-1. 业务说明: 1-1.1. 本实验以情人节送花为业务背景,女方提出送花 ...

  10. C语言---程序的一般形式、数据类型、常量变量、运算符、表达式、格式化输入输出

    1. 程序的一般形式 (1)注释 ① 分类:单行注释( // ): 注释一行.多行注释( /**/ ): 在这个区间内,都属于多行注释,可以换行. ② 作用:提示代码的作用,提示思路   不写注释的后 ...