Array和ArrayList都是Java中两个重要的数据结构,在Java程序中经常使用。并且ArrayList在内部由Array支持,了解Java中的Array和ArrayList之间的差异对于成为一名优秀的Java开发人员也至关重要。

另一方面 ,ArrayList是Java Collection框架中的一个类,它是作为动态数组引入的。由于数组本质上是静态的,即一旦创建后就无法更改数组的大小,因此,如果需要一个可以调整自身大小的数组,则应使用ArrayList。这是Array和ArrayList之间的根本区别。

它也是Java面试中经常问到的问题之一,如果您正在为下一份工作做准备,那么了解这些详细信息可能真的很有用。

Java中的Array与ArrayList

最好在某些点上对比两者,这更易于理解。因此,让我们看一下可以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和ArrayList之间的关键区别,因为可以提供_存储基本类型和对象_。例如,int []数字有效,但int的ArrayList无效。您如何处理这个问题?假设您想将int原语存储到ArrayList中,那又如何呢?好了,在Java中您可以使用包装器类。因此,如果您只想将int 2存储到ArrayList中,其余的操作将由自动装箱完成。顺便说一句,由于自动装箱,这种差异从Java 5开始并不明显,因为您会看到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、维度

数组和数组列表之间的另一个显着区别是,数组可以是多维的,例如,您可以具有二维数组或三维数组,这可以表示矩阵和2D地形的非常特殊的数据结构。

Array和ArrayList之间的相似性

到目前为止,您已经看到了ArrayList和副本之间的区别,现在让我们集中讨论一些相似之处。由于ArrayList在内部使用数组,因此必然有很多相似之处,如下所示:

1、数据结构

两者都允许您将对象存储在Java中,并且彼此都是基于索引的数据结构,可提供O(1)性能来检索元素,但是,如果对进行了排序和使用了二进制搜索算法,则没有索引的搜索仍然是LOG(N) 。

2、顺序

Array和AArrayList都保持将元素添加到其中的顺序。

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。


“不积跬步,无以至千里”,希望未来的你能:有梦为马 随处可栖!加油,少年!

关注公众号:「Java 知己」,每天更新Java知识哦,期待你的到来!

  • 发送「Group」,与 10 万程序员一起进步。
  • 发送「面试」,领取BATJ面试资料、面试视频攻略。
  • 发送「玩转算法」,领取《玩转算法》系列视频教程。
  • 千万不要发送「1024」...

Java中Array与ArrayList的10个区别的更多相关文章

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

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

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

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

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

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

  4. java中Array和ArrayList区别

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

  5. java中array,arrayList,iterator;

    Array        String []a = new String[10] ;  a[0] = "test" ; String []a = new String[]{&quo ...

  6. java中vector、ArrayList、LinkedList的区别

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

  7. 将java中数组转换为ArrayList的方法实例(包括ArrayList转数组)

    方法一:使用Arrays.asList()方法   1 2 String[] asset = {"equity", "stocks", "gold&q ...

  8. Java中List,ArrayList、Vector,map,HashTable,HashMap区别用法

    Java中List,ArrayList.Vector,map,HashTable,HashMap区别用法 标签: vectorhashmaplistjavaiteratorinteger ArrayL ...

  9. Java 中 Vector、ArrayList、List 使用深入剖析

    线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以 ...

随机推荐

  1. 使用vsphere client 克隆虚拟机的具体操作步骤

    采用 VMWare ESXi6.0,使用ESXi经常会遇到这样的问题,需要建立多个虚拟机,都是一样的操作系统,但是如果一台台装效率太低. VMware ESXi.VMware vCenter Serv ...

  2. C# 类库项目 无法创建 “资源字典” 文件

    1.接触WPF有两个月时间了,准备自己写一个样式库,在vs新建 类库项目后无法创建资源字典. 2.解决办法: 打开项目工程文件      (  project.csproj) 在 <Proper ...

  3. 21.决策树(ID3/C4.5/CART)

    总览 算法   功能  树结构  特征选择  连续值处理 缺失值处理  剪枝  ID3  分类  多叉树  信息增益   不支持 不支持  不支持 C4.5  分类  多叉树  信息增益比   支持 ...

  4. python爬取网页数据

    一.利用webbrowser.open()打开一个网站: ? 1 2 3 >>> import webbrowser >>> webbrowser.open('ht ...

  5. [译]Vulkan教程(15)图形管道基础之RenderPass

    [译]Vulkan教程(15)图形管道基础之RenderPass Render passes Setup 设置 Before we can finish creating the pipeline, ...

  6. UNIX系统编程知识点总结——思维导图

    根据考纲整理了一下本学期系统编程课的知识点,并且做成了思维导图便于理解和记忆 主要都是一些比较入门的知识点,UNIX博大精深,每一个知识点其实都能深挖 因为博客园不可能直接出思维导图,本文的主要内容都 ...

  7. tf.train.Saver()

    1. 实例化对象 saver = tf.train.Saver(max_to_keep=1) max_to_keep: 表明保存的最大checkpoint文件数.当一个新文件创建的时候,旧文件就会被删 ...

  8. ASP.NET Core 3.0 gRPC 配置使用HTTP

    前言 gRPC是基于http/2,是同时支持https和http协议的,我们在gRPC实际使用中,在内网通讯场景下,更多的是走http协议,达到更高的效率,下面介绍如何在 .NET Core 3.0 ...

  9. SpringCloud的入门学习之概念理解、Zuul路由网关

    1.Zuul路由网关是什么? 答:Zuul包含了对请求的路由和过滤两个最主要的功能,其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进 ...

  10. 爬虫selenium中截图

    一.整个页面截图 driver = webdriver.Chrome() driver.get(url) diver.save_screenshot('保存路径') 二.局部截图 driver = w ...