数组与 ArrayList 有什么区别?

数组是一种基本的数据结构,在 Java 中,数组是一段连续的内存空间,用来存储固定数量的同类型元素。

数组的大小在创建时确定,并且在之后不可改变。

特点:
  1. 固定大小:数组的长度是固定的,一旦创建就不能改变。
  2. 类型一致性:数组中的所有元素必须是相同的类型。
  3. 内存连续性:数组中的元素在内存中是连续存储的,这使得随机访问效率较高。
  4. 索引访问:数组支持通过索引来访问和修改元素。
示例代码:
// 创建整型数组
int[] numbers = new int[5];// 初始化数组
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
numbers[3] = 40;
numbers[4] = 50;// 打印数组
for (int i = 0; i < numbers.length; i++) {System.out.println(numbers[i]);
}

ArrayList

ArrayList 是 Java 集合框架的一部分,它实现了 List 接口,可以动态地改变大小。ArrayList 内部使用数组来存储元素,并在必要时自动调整大小。

特点:
  1. 动态大小:ArrayList 的大小可以根据需要动态改变。
  2. 类型多样性:ArrayList 中可以存储 Object 类型的元素,因此可以存储任何类型的对象。
  3. 内存不连续:ArrayList 在内部可能会重新分配更大的数组来存储更多的元素,因此内存不一定连续。
  4. 索引和迭代访问:ArrayList 支持通过索引访问元素,同时也支持使用 Iterator 进行遍历。
示例代码:
import java.util.ArrayList;// 创建 ArrayList
ArrayList<Integer> list = new ArrayList<>();// 添加元素
list.add(10);
list.add(20);
list.add(30);
list.add(40);
list.add(50);// 打印 ArrayList
for (Integer number : list) {System.out.println(number);
}

日常开发中的合理化使用建议

1. 根据需求选择
  • 固定大小:如果你知道数据的数量是固定的,并且不会改变,使用数组可能更适合。
  • 动态变化:如果你需要一个可以动态增长或缩小的列表,那么 ArrayList 是更好的选择。
2. 性能考量
  • 随机访问:数组在随机访问方面表现更好,因为它们在内存中是连续存储的。
  • 插入删除:ArrayList 在插入或删除元素时可能会有更高的成本,尤其是当操作在列表中间进行时。
3. 泛型使用
  • 类型安全性:使用 ArrayList 时,可以指定泛型类型来提高类型安全性,并防止运行时错误。
4. 线程安全
  • 并发访问:如果 ArrayList 需要在多线程环境中使用,需要注意同步问题,可以考虑使用 Vector 或 Collections.synchronizedList 来创建线程安全的列表。
5. 初始容量
  • 初始容量设置:如果预计 ArrayList 的大小会很大,可以显式设置初始容量来减少扩容次数,提高性能。
ArrayList<String> largeList = new ArrayList<>(10000); // 设置初始容量为10000

实际开发过程中的注意点

1. 数组越界异常

在使用数组时要小心索引越界错误。

try {System.out.println(numbers[5]); // 数组下标越界异常
} catch (IndexOutOfBoundsException e) {System.out.println("数组越界异常!");
}
2. ArrayList 的 null 元素

ArrayList 可以存储 null 元素,但需要注意 null 值可能会导致某些操作失败或产生意料之外的结果。

ArrayList<String> listWithNull = new ArrayList<>();
listWithNull.add(null);
System.out.println(listWithNull.get(0)); // 输出 null
3. ArrayList 的迭代器

使用 Iterator 进行遍历时,如果在遍历过程中修改了 ArrayList,将会抛出 ConcurrentModificationException 异常。

Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {Integer number = iterator.next();if (number == 30) {list.remove(number); // 错误的修改操作}
}

正确的做法是在遍历过程中使用 Iterator 的 remove 方法来移除元素。

Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {Integer number = iterator.next();if (number == 30) {iterator.remove(); // 正确的做法}
}

通过上述讨论,我们可以看到数组和 ArrayList 在 Java 中各有优缺点,合理地选择使用可以极大地提高程序的效率和可维护性。希望这些信息对你有所帮助!

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

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

相关文章

RPA技术重塑企业自动化的未来

1. RPA定义与原理 1.1 机器人流程自动化(RPA)概念 机器人流程自动化&#xff08;Robotic Process Automation&#xff0c;简称RPA&#xff09;是一种软件技术&#xff0c;通过模拟人类用户在计算机界面上的操作来执行重复性的业务流程任务。RPA软件机器人能够自动执行基于规则…

对比两个el-table,差异数据突显标记

前言 在数据分析和数据处理的过程中&#xff0c;经常需要对比两个数据集&#xff0c;以便发现其中的差异和变化。本文将介绍如何使用 el-table 组件来对比两个数据集&#xff0c;并通过差异数据的突显标记&#xff0c;帮助用户更直观地理解数据的变化。 cell-style 属性 其实利…

如何用 obdiag 排查 OceanBase数据库的卡合并问题——《OceanBase诊断系列》14

1. 背景 卡合并在OceanBase中是一个复杂的问题&#xff0c;其产生可能源于多种因素。目前&#xff0c;对于卡合并的明确界定尚不存在统一标准&#xff0c;一方面&#xff0c;我们界定超过36小时未完成合并为合并超时&#xff0c;此时RS会记录ERROR日志&#xff1b;另一方面&am…

4个硬盘数据修复攻略:让你的数据失而复得。

据统计&#xff0c;在硬盘数据丢失的情况当中&#xff0c;有7成是因误删除、格式化和病毒攻击导致的。并且对与很多人来说&#xff0c;数据丢失是一个不小的问题。今天我就给大家分享几款能够帮助硬盘恢复数据的工具&#xff0c;希望能够在数据丢失是减小大家的焦虑。 1、福昕硬…

mac nwjs程序签名公证(其他mac程序也一样适用)

为什么需要公证 mac os14.5之后的系统&#xff0c;如果不对应用进行公证&#xff0c;安装&#xff0c;打开&#xff0c;权限使用上都会存在问题&#xff0c;而且有些问题你强制开启&#xff08;sudo spctl --master-disable&#xff09;使用后可能会有另外的问题&#xff0c; …

Python+pytest接口自动化之session会话保持的实现

前言 在接口测试的过程中&#xff0c;经常会遇到有些接口需要在登录的状态下才能请求&#xff0c;否则会提示请登录&#xff0c;那么怎样解决呢&#xff1f;我们可以通过Cookie绕过登录&#xff0c;其实这就是保持登录状态的方法之一。那么今天笔者想讲通过session进行会话保持…

衡石分析平台系统分析人员手册-导入图表库图表

导入图表库图表​ 本文讲述在仪表盘中如何使用图表库图表&#xff0c;如果您还不了解图表库&#xff0c;请先点击链接了解它的功能和作用。 在数据集市中建立图表库后&#xff0c;分析人员可以在应用创作中引用图表库图表&#xff0c;快速的进行数据分析工作。 导入图表库图…

java第三天(游戏开发)

学到 双缓存机制 public void paint(Graphics g) {// super.paint(g);//createImage(width, height) 是一个方法调用&#xff0c;它创建了一个指定宽度和高度的空图像缓冲区。这个方//法可以在 Component 类中找到&#xff0c;因此任何从 Component 继承的类&#xff08;比…

Unix:Linux的“祖师爷”

目录 Unix的诞生 Unix对Linux的深远影响 Unix与Linux区别在哪里&#xff1f; Unix的诞生 Unix操作系统诞生于1969年&#xff0c;由肯汤普逊&#xff08;Kenneth Lane Thompson&#xff09;和丹尼斯里奇&#xff08;Dennis MacAlistair Ritchie&#xff09;在AT&T的贝尔实…

牛客周赛 Round 65

文章目录 超市思路&#xff1a;Solved&#xff1a; 雨幕思路&#xff1a;Solved&#xff1a; 闺蜜思路&#xff1a;Solved&#xff1a; 医生思路&#xff1a;Solved&#xff1a; 降温&#xff08;easy&#xff09;思路&#xff1a;Solved&#xff1a; F-降温&#xff08;hard&a…

iOS Swift逆向——被编译优化后的函数参数调用约定修复

头文件导入&#xff1a; typedef long long s64; typedef unsigned long long u64;typedef s64 Int; typedef u64 Bool;struct Swift::String {u64 _countAndFlagsBits;void *_object; };union Swift_ElementAny {Swift::String stringElement; };struct Swift_Any {Swift_Ele…

前端算法:树(力扣144、94、145、100、104题)

目录 一、树&#xff08;Tree&#xff09; 1.介绍 2.特点 3.基本术语 4.种类 二、树之操作 1.遍历 前序遍历&#xff08;Pre-order Traversal&#xff09;&#xff1a;访问根节点 -> 遍历左子树 -> 遍历右子树。 中序遍历&#xff08;In-order Traversal&#xf…

Spring Web MVC 入门

1. 什么是 Spring Web MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从从⼀开始就包含在Spring框架中。它的 正式名称“SpringWebMVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为"Spring MVC". 什么是Servlet呢? Ser…

错误:无法推送一些引用到 ‘https://gitee.com/chek_kk/python-electron-app.git‘

这个错误提示说明在提交时某个文件的大小超过了 Gitee 仓库的单文件大小限制&#xff08;100MB&#xff09;。你需要从Git 历史中彻底移除这个大文件&#xff0c;否则无法推送到远程仓库。 解决步骤 1. 确认大文件信息 使用以下命令找出超过限制的大文件&#xff1a; git re…

Oracle OCP认证考试考点详解082系列01

题记&#xff1a; 本篇博文是Oracle OCP认证考试考点详解082系列的第一篇&#xff0c;本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 1. 第一题&#xff1a; 1. 题目 2. 解析及答案 关于Oracle数据库中节…

映射问题的解决办法(mybaitis)

最初我用的是注解来操控数据库&#xff08;注释掉的部分&#xff09; Mapper public interface ThreadMapper {// Select("SELECT * FROM thread LIMIT #{page}, #{size}")List<Thread> getListByPage(Param("page") int page, Param("size&qu…

网络安全证书介绍

网络安全领域有很多专业的证书&#xff0c;可以帮助你提升知识和技能&#xff0c;增强在这个行业中的竞争力。以下是一些常见的网络安全证书&#xff1a; 1. CompTIA Security 适合人群&#xff1a;初级安全专业人员证书内容&#xff1a;基础的网络安全概念和实践&#xff0c…

嵌入式学习-网络-Day03

嵌入式学习-网络-Day03 1.linux下IO模型及特点 1.1阻塞式IO 1.2非阻塞式IO 设置非阻塞&#xff1a; 1&#xff09;通过函数参数设置 2&#xff09;通过fcntl函数设置文件描述符属性 1.3信号驱动IO&#xff08;异步IO&#xff09; 1.4IO多路复用&#xff08;重点&#xff09; IO…

【Qt】QTableView添加下拉框过滤条件

实现通过带复选框的下拉框来为表格添加过滤条件 带复选框的下拉框 .h文件 #pragma once #include <QCheckBox> #include <QComboBox> #include <QEvent> #include <QLineEdit> #include <QListWidget>class TableComboBox : public QComboBox …

云渲染渲染100怎么使用?

下载安装步骤&#xff1a; 访问官方网站下载客户端&#xff1a; 请访问渲染100官网&#xff1a;云渲染_性价比更高的3D云渲染平台_渲染100【官网】&#xff0c;并点击“客户端下载”按钮。 安装程序&#xff1a; 下载完成后&#xff0c;双击安装文件进行安装。在安装过程中&am…