Java中Array和ArrayList之间的9个区别

array和ArrayList都是Java中两个重要的数据结构,在Java程序中经常使用。 即使ArrayList在内部由数组支持,了解Java中的数组和ArrayList之间差异对于成为一名优秀的Java开发人员也至关重要。 如果您知道相似点和不同点,则可以明智地决定何时在AraryList上使用数组,反之亦然。

在本文中,我将帮助您了解不同之处。 如果您来自C或C ++背景,那么您已经知道数组是编程世界中最有用的数据结构之一。 它为基于索引的搜索提供O(1)性能,并且是存储数据的基本方式之一。

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

Java中的Array vs ArrayList

最好在某些点上比较两件事,这将使差异易于理解。 因此,让我们看看可以在Java中将数组与ArrayList进行比较的几点

1.实施

数组是本机编程组件或数据结构,但ArrayList是Java Collections框架(API)中的类。 实际上, ArrayList是使用array在内部实现的 。 由于ArrayList是一个类,因此它拥有一个类的所有属性,例如,您可以创建对象和调用方法,但是即使数组是Java中的对象,它也不提供任何方法。 它只是公开一个length属性来为您提供数组的长度,它是恒定的。

2.表现

由于ArrayList基于数组,因此您将假定它提供与数组相同的性能。 在某种程度上确实如此,但是由于ArrayList提供了额外的功能,因此ArrayList和数组之间的性能存在一些差异,主要是在内存使用和CPU时间方面。

对于基于索引的访问,ArrayList和array都提供O(1)性能,但是如果添加新元素会触发调整大小,则add在ArrayList中可以为O(logN) ,因为它涉及在后台创建新数组并从旧数组中复制元素到新的数组 。 ArrayList的内存需求还不止一个用于存储相同数量对象的数组,例如,由于ArrayList和wrapper类的对象元数据开销较大,因此int[]会比ArrayList占用更少的内存来存储20个int变量。

3.类型安全

ArrayList是类型安全的,因为它支持泛型,泛型允许编译器检查ArrayList中存储的所有对象的类型是否正确。 另一方面, 数组不支持Generics 。 这意味着无法进行编译时检查,但是如果您尝试将不正确的对象存储到数组中(例如,将String存储到int数组中),则array通过抛出ArrayStoreException来提供运行时类型检查。

4.灵活性

灵活性是分隔array和ArrayList的最重要的事情。 简而言之,ArrayList比普通的本地数组更灵活,因为它是动态的。 它可以在需要时自行增长,而本机阵列则无法实现。 ArrayList还允许您删除本机数组无法实现的元素。 通过删除,我们的意思不仅是将null分配给相应的索引,还意味着将其余元素向下复制一个索引,而ArrayList会自动为您执行此操作。 您可以在我的文章clear()和removeAll()之间的区别中了解有关从ArayList删除对象的更多信息。

5.原语

如果您首先开始使用ArrayList,那么您将意识到您无法在ArrayList上存储基元。 这是array和ArrayList之间的主要区别,因为array允许存储基元和object 。 例如,int []数字有效,但int的ArrayList无效。 您如何处理这个问题?

假设您想将int原语存储到ArrayList中,那又如何呢? 好了,您可以使用包装器类。 这是在Java中引入包装器类的原因之一。 因此,如果您只想将int 2存储到ArrayList中,其余的操作将由自动装箱完成。 顺便说一句,由于自动装箱 ,这种差异从Java 5开始并不明显,因为您会看到ArrayList.add(21)完全有效并且可以正常工作。

6.泛型

ArrayList和数组之间的另一个重要区别是,前者支持Generic,而后者不支持Generic。 由于数组是协变类型的,因此可以将泛型与它们一起使用。 这意味着编译器不可能在编译时检查数组的类型安全性,但他们可以验证Array的类型安全性。 那么在用Java编写类型安全的类时如何处理这个问题呢? 好了,您可以使用有效Java中显示的技术,在其中可以声明一个像E[]这样的数组,然后使用类型转换。

7.迭代

ArrayList提供了更多的迭代方式,即与数组相比一一访问所有元素。 您只能使用循环,例如for,while,for循环的增强和do-while来遍历数组,但也可以使用Iterator和ListIterator类来遍历ArrayList。 请参阅此处以了解在Java中迭代ArrayList的不同方法。

8.支持的运营

由于ArrayList在内部由数组支持,因此它公开了数组可能执行的操作,但鉴于其动态性质,它还添加了本机数组无法执行的操作,例如,您可以在array和ArrayList中存储元素,但只有ArrayList允许您删除一个元素。 尽管您可以通过将null分配给相应的索引来模拟数组,但是除非您也将数组中该索引上方的所有元素都向下移动一级,否则它不会像remove。

ArrayList和array都提供了检索元素的方法,例如ArrayList的get()方法使用索引从数组中获取元素,例如, version[0]将返回第一个元素。

ArrayList还提供清除和重用的操作,例如clear()removeAll() ,数组不提供该操作,但是您可以循环访问Array并为每个索引分配null来模拟它。

9. Size()与长度

数组仅提供一个length属性,该属性告诉您数组中的插槽数,即可以存储多少个元素,它不提供任何方法来找出已填充的元素数和多少个插槽为空,即元素。 尽管ArrayList确实提供了size()方法,该方法告诉给定时间点存储在ArrayList中的对象数量。 size()始终与长度不同,这也是ArrayList的容量。 如果您想了解更多信息,建议您阅读ArrayList文章中的size()和length之间的区别 。

10.尺寸

数组和ArrayList之间的另一个显着区别是,数组可以是多维的,例如,您可以具有二维数组或三维数组,这使其成为表示矩阵和2D地形的非常特殊的数据结构。 另一方面,ArrayList不允许您指定尺寸。 请参阅本教程,以了解有关如何在Java中使用多维数组的更多信息。

这是一张很好的幻灯片,突出显示了Java中Array和ArrayList之间的所有重要区别:

Java中Array与ArrayList之间的区别

Array和ArrayList之间的相似之处

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

1.数据结构

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

2.订购

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

3.搜索

您可以使用索引搜索元素,即O(1)否则,如果数组未排序,则可以使用线性搜索,这大约需要O(n)时间,也可以在Java中对数组进行排序后使用二进制搜索,这正在排序+ O(logN)。

4.空值

array和ArrayList都允许空值,但请记住只有对象数组才允许空基元数组,它们不存储基元类型的默认值,例如int为零,布尔false

5.重复

array和ArrayList都允许重复。 这也是编写程序以从数组中找出重复项的常见的基于数组的编码问题之一 。

6.表现

ArrayList模拟数组的性能,例如,如果您知道索引,则可以进行O(1)访问,但它具有额外的内存开销,因为它是一个对象,并且还拥有其他数据以自动调整ArrayList的大小。

7.零基索引

array和ArrayList都具有从零开始的索引,即第一个元素从第零个索引开始。

您应该记住的最重要的区别是,数组本质上是静态的,即创建后就无法更改其大小,但是ArrayList是动态数组,如果ArrayList中的元素数大于调整大小阈值,则可以调整自身大小。 基于这种差异,如果事先知道大小并确定它不会改变,则应该使用数组作为数据结构来存储对象;如果不确定,则只需使用ArrayList。

翻译自: https://www.javacodegeeks.com/2016/01/9-differences-between-array-and-arraylist-in-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python读二进制文件遍历_使用python反向读取二进制文件

从这个问题中我可以看出代码中有几点需要改进。首先,while循环在Python中很少使用,因为使用for循环或使用一些内置函数几乎总是有更好的方法来表达相同的内容。在我想代码纯粹是为了培训目的。否则,我会首先问真正的目标是什么(因为知道了问题…

vue 在已有的购买列表中(数据库返回的数据)修改商品数量

连续加班一个月 连续通宵三天 到最后还是少了一个功能 心碎 简介:一个生成好的商品列表(数据库返回的数据) 首先拿到我们需要渲染的数组 在data中定义 我是在测试的时候 直接写了两条数据 下面开始点击删除 点击添加是一样的代码 只不过加号…

python饼状图教程_Python数据可视化:饼状图的实例讲解

使用python实现论文里面的饼状图:原图:python代码实现:# # 饼状图# plot.figure(figsize(8,8))labels [uCanteen, uSupermarket, uDorm, uOthers]sizes [73, 21, 4, 2]colors [red, yellow, blue, green]explode (0.05, 0, 0, 0)patches,…

小看--单例设计模式

(一)单例设计描述 只要了解过设计模式的同学都会知道:单例设计模式,大家都知道单例设计模式是一种创建行的设计模式。既然是创建型,那么先来讲讲,对象的创建的过程吧。 --静态成员:静态成员在程…

动态方法注入 grails_Grails动态下拉菜单

动态方法注入 grails最近,我有一个UI要求,客户希望从两个单独的下拉列表中选择值。 第一个下拉列表的值实质上过滤了第二个下拉列表的值。 鉴于我们支持的财务项目对UI的要求并不严格,因此我不得不进行一些初步的学习和试验,以实现…

selenium原理python_从python角度解析selenium原理

1、selenium工作流程2、selenium工作原理(1)客户端和服务端之间实际是通过http协议进行通信,服务端的接口文档可参考:https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#sessionsessionidelement(2)客户端按照服务端接口要求传入请求方式、…

Jmeter(二)Jmeter目录介绍

看过许多有关Jmeter的博客,算得上的收获颇丰;不过最牛逼的博客还是“官方文档”,官方文档是ApacheJmeter自己对自己产品的说明,论起对自己产品的理解程度,那肯定是自己嘛。。。因此推荐大家从Jmeter的官方文档开始学习…

使用Spring Data MongoDB和Spring Boot进行数据聚合

MongoDB聚合框架旨在对文档进行分组并将其转换为聚合结果。 聚合查询包括定义将在管道中执行的几个阶段。 如果您对有关该框架的更深入的细节感兴趣,那么 mongodb docs是一个很好的起点。 这篇文章的重点是编写一个用于查询mongodb的Web应用程序,以便从…

结合前段修改mysql表数据_jquery实现点击文字可编辑并修改保存至数据库

这个方法网上可以查到很多,但是好多只有点击文字编辑并保持,但是没有完整的代码写怎么保存到数据库。因为本人才疏学浅,费啦好长时间才写好把修改的内容只用一条sql语句保存到数据库,今天在这里和大家分享这是运行图片这是前台页面…

关于类、抽象类和接口的继承关系

关于类、抽象类和接口的继承关系 Java类的继承是单继承的,就是一个类只能继承一个类,但是可以通过接口来实现多继承,一个类可以实现多个接口。通过这种方式,Java类就可以实现多继承的关系。但是在继承类和实现接口的时候&#xff…

js符号转码_JS 文字符串转换unicode编码函数

AJAX传递中文字符串时必须把中文字符串编码成unicode,一般会用到JS的自带函数escape().不过找到了更好的函数来确决中文字符转换成unicode编码的函数function uniencode(text){text escape(text.toString()).replace(/\/g, "%2B");var matches text.match(/(%([0-9…

ASP.NET Core 2.0 MVC 发布部署--------- ASP.NET Core 发布的具体操作

ASP.NET Core 发布的具体操作 下面使用C# 编写的ASP.NET Core Web项目示例说明发布的全过程。 1、创建项目 选择“文件” > “新建” > “项目”。 在“添加新项目”对话框中,在“已安装” “Visaul C#” “Web” 项目类型窗格中选择“ASP.NET Core Web 应用…

jsf集成spring_Spring和JSF集成:国际化和本地化

jsf集成spring如果您正在开发针对多种语言的JSF应用程序&#xff0c;那么您可能很熟悉<f&#xff1a;loadBundle>标记。 即使您的应用程序不支持使用消息捆绑包进行国际化仍然是一个好主意。 在<f&#xff1a;loadBundle>标签的作用下&#xff0c;它从Java java.ut…

java 设置两个方法互斥_分享两个操作Java枚举的实用方法

1. 前言Java枚举在开发中是非常实用的。今天再来分析几个小技巧并且回答一些同学的的疑问。首先要说明的是我的枚举建立在以下的范式之中&#xff1a;枚举统一接口范式2. 如何把枚举值绑定的下拉列表这种场景非常常见&#xff0c;如果你把状态、类别等属性封装成枚举的结构&…

微信小程序正确的异步request请求,根据经纬度获取地理位置信息

微信小程序的所有request请求都是异步的&#xff0c;不支持同步。但是在请求时可能会耗费一定时间&#xff0c;这样的话在获取返回数据时可能方法还没有执行完就已经进行赋值操作了。我遇到的就是拿到的数据为undefined。 解决办法&#xff0c;使用回调函数&#xff0c;等操作完…

Spring管理的交易说明-第2部分(JPA)

在本系列的第一部分中 &#xff0c;我展示了事务如何在普通JDBC中工作 。 然后&#xff0c;我展示了Spring如何管理基于JDBC的事务。 在本系列的第二部分中&#xff0c;我将首先展示事务如何在普通的JPA中工作。 然后展示Spring如何管理基于JPA的事务。 资金转移 为了帮助说明…

oracle_sqlserver和mysql获取表外键的方法_mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结...

mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结1. MYSQL数据库1) 创建索引CREATE INDEX index_name ON table_name(column_list)CREATE UNIQUE INDEX index_name ON table_name(column_list)修改表的方式添加索引ALTER TABLE table_name ADD INDEX in…

CCC数字钥匙设计【BLE】--车主配对之BLE OOB配对

本文主要介绍CCC3.0采用BLE进行车主配对时&#xff0c;关于蓝牙OOB配对的内容。 首先&#xff0c;介绍下BLE Pairing的一些基础知识&#xff0c;有一些基本概念。之后&#xff0c;再着重介绍CCC规范定义的BLE OOB配对流程。 1、BLE Pairing基础知识 下面先简单介绍下BLE 5.0协…

mysql 重置密码模式_mysql--重置密码

解决Mysql忘记密码&#xff1a;1、首先停止正在运行的MySQL进程&#xff1a;[rootcml5 ~]# systemctl stop mysqld2、以安全模式启动MySQL&#xff1a;[rootcml5 ~]# /usr/local/mysql/bin/mysqld_safe--skip-grant-tables &##或者在my.cnf文件下添加&#xff0c;执行完后就…

Java EE 8中的MVC 1.0:使用Facelets入门

MVC 1.0是一个基于动作的Model-View-Controller Web框架&#xff0c;它将成为将来的Java EE 8的一部分。它将与基于组件的JSF框架并存&#xff0c;并提供构建面向HTML javascript的应用程序的替代方法完全控制网址。 这篇文章总结了使用Facelets代替默认的JSP作为MVC框架的视…