ArrayList 与数组和列表的比较

2023-12-02

我已经编程了相当多的时间,最近开始学习更多纯粹的计算机科学主题(用于工作面试)。

我知道数组和 LinkedList 数据结构之间的区别,但现在我已经开始使用 Java,我看到了这个 ArrayList,但我很难概念化它。

网络搜索只真正向我展示了如何使用它们以及何时使用它们(各自的好处),但没有任何东西可以回答我的问题:

什么是数组列表?我的假设是它是一个列表,维护对每个元素的内存引用,使其也能够像数组一样工作。

我也有一种感觉,因为 Java 是开放的,所以我应该能够查看类定义,但还没有弄清楚如何做到这一点。

Thanks!


我喜欢将其视为一种数据结构,让您享受两个世界:像数组一样快速访问索引,以及列表的无限增长。当然,总是需要权衡。

ArrayList实际上是数组的包装。每当数组大小结束时,就会创建一个两倍大小的新数组,并将原始数组中的所有数据复制到新数组中。

来自java文档:

List 接口的可调整大小的数组实现。实现所有 可选列表操作,并允许所有元素,包括 null。在 除了实现 List 接口之外,该类还提供 操作内部使用的数组大小的方法 存储列表。 (这个类大致相当于 Vector,除了 它是不同步的。)大小、isEmpty、get、set、迭代器和 listIterator 操作以恒定时间运行. The 添加操作运行 在摊余常数时间内,即添加n个元素需要O(n) 时间。所有其他操作都以线性时间运行(大致为 请讲)。与常数因子相比,常数因子较低 链表实现。

每个 ArrayList 实例都有一个容量。容量大小为 用于存储列表中元素的数组。它总是在 至少与列表大小一样大。当元素被添加到 ArrayList,它的容量会自动增长。成长细节 除了添加元素这一事实之外,没有指定策略 固定摊销时间成本。

应用程序可以增加 ArrayList 实例的容量 在使用ensureCapacity添加大量元素之前 手术。这可以减少增量重新分配的量。

这允许O(1)访问大多数操作就像访问数组一样。有时,您需要为这种性能付出代价,因为插入操作需要花费更长的时间。

这就是所谓的摊销的复杂。每次操作只需要O(1)除此之外,您需要将数组的大小加倍。那时你会付出O(n)但如果你对 n 次操作进行平均,所花费的平均时间仅为O(1)并不是O(n).

让我们举个例子:

我们有一个大小为 100 (n=100) 的数组。您进行 100 次插入操作(针对不同的索引),每个操作仅需要O(1),当然所有按索引获取的操作也需要O(1)(因为这是一个数组)。在第 101 次插入时,数组中不再有容量,因此 ArrayList 将创建一个新数组,大小为 200,将所有值复制到其中(O(n)操作),然后插入第 101 项。在将数组填充到 200 个项目之前,所有操作都需要O(1).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ArrayList 与数组和列表的比较 的相关文章

  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐