java溯本求源之基础(二十五)之--ArrayList常用方法介绍

1. 介绍
1.1简介 ArrayList

     ArrayList 是 Java 集合框架中的一个类,位于 java.util 包中。它实现了 List 接口,提供了一个动态数组的功能。与普通数组不同,ArrayList 可以在需要时自动调整其容量,以容纳更多的元素。这使得它非常适合用于需要频繁增删元素的场景。

        先上我最爱的妹子图片嘿嘿!!!

1.2 使用场景

ArrayList 主要用于以下场景:

  • 动态调整大小的数组:适合需要经常增删元素的场景,例如动态列表。
  • 数据缓存:由于其快速的随机访问特性,适合用于缓存数据。
  • 队列实现:可以用作简单的队列数据结构。
  • 替代链表:在插入和删除操作不频繁的情况下,ArrayList 的访问速度比链表更快。当然我们如果直接调用arraylist的add方法,那么其实很快的,但是如果在中间插入就会很慢
  • 集合操作:适合进行各种集合操作,例如求并集、交集等。
2. ArrayList的定义与初始化
2.1定义 ArrayList

        在 Java 中,ArrayList 是通过 java.util 包中的 ArrayList 类实现的。它提供了一个可以动态调整大小的数组实现,便于在需要时增加或删除元素。

2.2初始化方法

        要使用 ArrayList,首先需要导入 java.util.ArrayList 类,然后可以通过以下几种方式来初始化 ArrayList

2.2.1默认初始化
ArrayList<String> list = new ArrayList<>();
2.2.2指定初始容量
ArrayList<String> list = new ArrayList<>(10);
2.2.3通过另一个集合初始化
List<String> existingList = Arrays.asList("Apple", "Banana", "Orange");
ArrayList<String> list = new ArrayList<>(existingList);
2.2.4 示例代码

下面是一个基本的示例,展示了如何定义和初始化一个 ArrayList

import java.util.ArrayList;public class Main {public static void main(String[] args) {// 定义并初始化一个 ArrayListArrayList<String> list1 = new ArrayList<>();// 添加元素list.add("Apple");list.add("Banana");list.add("Orange");// 输出 ArrayListSystem.out.println(list1);// 另外一种初始化方式ArrayList<String> list2 = new ArrayList<>(Arrays.asList("Apple", "Banana",             "Orange"));System.out.println(list2);}
}
3. 基本操作
3.1增加元素

使用 add() 方法可以在 ArrayList 中增加元素:

list.add("Grapes");

add() 方法有两种形式:

  • add(E e): 在 ArrayList 的末尾添加元素。
  • add(int index, E element): 在指定位置插入元素,其后的元素依次后移。
3.2 访问元素

使用 get() 方法可以通过索引访问元素:

String fruit = list.get(1); // 访问第二个元素

get(int index) 方法返回指定位置的元素,如果索引超出范围,会抛出 IndexOutOfBoundsException

3.3修改元素

        使用 set() 方法可以修改指定位置的元素:

list.set(1, "Blueberry"); // 将第二个元素改为 Blueberry

    set(int index, E element) 方法将指定位置的元素替换为新的元素,并返回被替换的元素。

3.4 删除元素

使用 remove() 方法可以删除指定位置或指定值的元素:

list.remove(0); // 删除第一个元素
list.remove("Banana"); // 删除第一个匹配的元素

remove(int index) 删除指定索引处的元素,remove(Object o) 删除第一个匹配的元素。

4.注意事项
4.1. 遍历和删除元素

        在使用 ArrayList 时,通过增强 for 循环(或称“for-each”循环)遍历集合时不能直接删除元素。这是因为增强 for 循环不支持对集合结构进行修改。要删除元素,可以使用 Iterator 进行遍历并删除:

import java.util.ArrayList;
import java.util.Iterator;public class Main {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String fruit = iterator.next();if (fruit.equals("Banana")) {iterator.remove(); // 使用迭代器删除元素}}System.out.println(list);}
}
4.2 自动扩容机制

     ArrayList 具有自动扩容机制,当容量不足时会自动增加容量。虽然方便,但也会带来性能开销,因为每次扩容时需要将所有元素复制到新数组中。因此,如果能预测到集合的大致规模,初始化时可以指定初始容量以减少扩容次数:

ArrayList<String> list = new ArrayList<>(100); // 指定初始容量
4.3 与数组的区别
  • 数组:固定大小,元素类型固定。
  • ArrayList:动态调整大小,存储对象类型(可以存储不同类型的对象,但一般使用泛型指定类型)。
4.4 线程安全

    ArrayList 不是线程安全的。如果在多线程环境中使用,需使用同步机制或考虑使用线程安全的集合类,如 CopyOnWriteArrayListCollections.synchronizedList 方法:

List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
5. ArrayList的特点和注意事项
5.1自动扩容机制

    ArrayList 使用初始容量创建内部数组,当元素数量超过当前容量时,会自动扩容,通常是原来容量的1.5倍。频繁添加大量元素时,可能会产生性能开销。

5.2 与数组的区别
  • 大小:数组大小固定;ArrayList 可动态调整大小。
  • 类型:数组存储基本类型和对象类型;ArrayList 只能存储对象类型。
  • 性能:数组访问元素速度更快;ArrayList 在添加和删除元素时更灵活。
5.3 性能注意事项
  • 增删操作:在非末尾位置插入或删除元素需要移动后续元素,时间复杂度为 O(n)。
  • 扩容:扩容需要复制原有元素,频繁扩容会影响性能。可通过指定初始容量减少扩容次数。
5.4 线程安全

   ArrayList 不是线程安全的,在多线程环境中使用时需使用同步机制。可以使用 Collections.synchronizedList 方法创建同步的 ArrayList,或使用线程安全的 CopyOnWriteArrayList 类。

6. 结论

优点

  • 动态调整大小:可以根据需要自动扩容,适应不同数量的元素。
  • 灵活性:提供了丰富的方法来操作集合中的元素,如添加、删除、修改等。
  • 随机访问:支持通过索引快速访问元素,访问速度接近数组。

缺点

  • 性能开销:在频繁增删元素时,特别是在中间位置,可能导致性能问题。
  • 线程安全ArrayList 不是线程安全的,需要在多线程环境中手动同步。
使用建议
  • 在需要频繁随机访问元素的场景下使用 ArrayList
  • 如果预期会添加大量元素,尽量指定一个较大的初始容量以减少扩容次数。
  • 在多线程环境中使用时,要考虑使用同步机制或选择线程安全的集合类。

    ArrayList 是 Java 集合框架中的重要组成部分,其动态调整大小和灵活操作的特性使得它非常适合用于需要频繁操作集合的场景。通过理解其工作原理和注意事项,开发者可以更加高效地利用 ArrayList 来实现各种需求。

        求关注!!! 求收藏!!!

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

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

相关文章

鸣潮基于虚幻引擎4的多平台效果和性能优化实践

《鸣潮》基于虚幻引擎4的多平台效果和性能优化实践 | 王宏波 库洛游戏 文章目录 《鸣潮》基于虚幻引擎4的多平台效果和性能优化实践 | 王宏波 库洛游戏Why Deferred Shading移动端高质量的TAAU渲染流程Ghost和Flicker优化&#xff0c;一些图像空间算法的融入动静态像素的差异处…

第三代全智能AI无人直播系统:销售变现的革新利器

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经(keJ0277)逐渐渗透到我们生活的方方面面。特别是在直播销售领域&#xff0c;第三代全智能AI无人直播系统的出现&#xff0c;正成为销售变现的革新利器&#xff0c;引领着行业的新一轮变革。一、全智能AI无…

mysql数据库的管理

MySQL数据库管理 mysql数据文件 存放在初始化时定义的datadir 该目录下放置三种后缀文件 .frm 与表相关的元数据&#xff08;meta&#xff09;&#xff0c;表结构的定义信息等。 .MYD mylSAM存储引擎专用 .MYI mylSAM存储引擎专用 MySQL语言类型 DDL&#xff08;数据定义语言…

2024.06.24【读书笔记】丨生物信息学与功能基因组学(第十八章 人类疾病 第二部分)【AI测试版】

第二部分:人类遗传疾病的生物信息学方法 章节标题:【读书笔记】丨生物信息学与功能基因组学(第十八章 人类疾病 第二部分) 摘要: 第二部分聚焦于如何利用生物信息学方法来研究人类遗传疾病。随着生物信息学的发展,我们能够通过计算工具和数据库来分析蛋白质、基因和基…

App推广新突破!Xinstall无注册码方案,一键解决您的获客难题

在互联网的浪潮中&#xff0c;App推广与运营面临着前所未有的挑战。随着流量红利的衰退&#xff0c;如何高效、精准地触达用户&#xff0c;提升用户留存和转化率&#xff0c;成为每个企业都必须面对的问题。在这个关键时刻&#xff0c;Xinstall以其无注册码的解决方案&#xff…

使用vant4+vue3制作电商购物网站

一、前言 1.本项目基于vant4vue3构建&#xff0c;默认友友们已具备相关知识&#xff0c;如不具备&#xff0c;请友友们先去了解相关该概念 2.项目数据来源于开源框架 新峰商城 在此指出 3.此项目目的在于帮助友友们了解基本的用法&#xff0c;没有涉及太多的逻辑操作。 二、…

软件设计师笔记-系统开发和运行知识(二)

模块 构成模块(或称为组件)的四个基本要素:输入和输出、处理功能、内部数据、程序代码。 输入 (Input): 输入是模块从外部接收的数据、信号或指令。这些输入数据可以是用户通过用户界面输入的,也可以是从其他模块或系统传递过来的。输入数据的类型、格式和范围对模块的功能…

Java中的安全架构设计与实现

Java中的安全架构设计与实现 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来聊聊Java中的安全架构设计与实现。随着互联网技术的不断发展&#xff0c…

magisk获取root

使用magisk修补boot.img 一定是手机系统匹配的 boot.img 刷入手机的 /storage/emulated/0/Download/ adb push "E:\下载\boot.img" /storage/emulated/0/Download/ 使用 magisk 点击安装&#xff0c; 有Recovery 取消勾选 选择 修补一个文件&#xff0c; 选择手机下…

零基础CMake学习笔记

零基础CMake学习笔记 1. 名词解释make cmake Makefile CMakeLists.txt 2. CMake语法介绍2.1 常用指令2.1.1 project2.1.2 set2.1.3 message2.1.4 add_executable2.1.5 aux_source_directory2.1.6 include_directories2.1.7 add_definitions2.1.8 add_subdirectory2.1.9 add_lib…

针对AIGC检测的鲁棒性测试——常见攻击手段汇总

前言&#xff1a;这篇文章来总结一下针对AIGC检测的常见攻击手段&#xff0c;选取的研究工作均出自近5年AIGC检测相关文章。&#xff08;论文被拒了需要补实验&#xff0c;先来看看别人怎么做的……&#xff09; 2019 WIFS Detecting and Simulating Artifacts in GAN Fake Ima…

JavaScript的学习之事件的简介

目录 一、事件是什么 二、如何处理事件 一、事件是什么 定义&#xff1a;事件就是浏览器和用户之间的交互行为。 例如&#xff1a;点击按钮、鼠标移动、关闭窗口等。 二、如何处理事件 我们可以在对应的事件属性中设置一些JS行为&#xff0c;当事件触发的时候会将这些代码执行…

关于Pandas的数据填充

前言 在数据分析与预处理过程中&#xff0c;脏数据几乎不可避免&#xff0c;这直接影响到后续分析的准确性和可靠性。清洗数据中最常见的就是处理空值。Pandas DF的数据填充功能非常强大。本文介绍Pandas中常用的几种数据填充&#xff08;也称为缺失值处理&#xff09;方法&am…

35岁,是终点?还是拐点?

35岁&#xff0c;是终点还是拐点&#xff0c;取决于我们对生活和事业的态度、目标以及行动。这个年龄可以看作是一个重要的转折点&#xff0c;具有多重意义和可能性。 很多人在35岁时&#xff0c;已经在自己的职业生涯中建立了一定的基础&#xff0c;可能达到了管理层或专家级别…

Python量化交易学习——Part8:带有技术因子指标的多因子策略

技术面分析又称技术分析(Technical Analysis ),是股票投资分析的专业术语。技术分析研究以往价格和交易量数据,进而预测未来的价格走向。此类型分析侧重于图表与公式的构成,以捕获主要和次要的趋势,并通过估测市场周期长短,识别买入 / 卖出机会。根据您选择的时间跨度,…

Charles抓包工具系列文章(二)-- Repeat 回放http请求

一、什么是http请求回放 当我们对客户端进行抓包&#xff0c;经常会想要重试http请求&#xff0c;或者改写原有部分进行重新请求&#xff0c;都需要用到回放http请求。 还有一种场景是压力测试&#xff0c;对一个请求进行重复请求多少次&#xff0c;并加上适当的并发度。 这里…

【PythonWeb开发】Flask视图函数传递数据到前端模版的方法总结。

在Flask框架中&#xff0c;视图函数返回响应有四种常见方式&#xff0c;都得掌握。 一、返回文本内容 可以直接返回字符串&#xff0c;Flask会自动将其转换为一个响应对象&#xff0c;具有默认的text/html内容类型。 app.route(/return_text) def return_text():return "…

力扣第211题“添加与搜索单词 - 数据结构设计”

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料 在本篇文章中&#xff0c;我们将详细解读力扣第211题“添加与搜索单词 - 数据结构设计”。通过学习本篇文章&#xff0c;读者将掌握如何实现一个支持通配符搜索的字典数据结构&…

WebStorm 配置 PlantUML

1. 安装 PlantUML 插件 在 WebStorm 插件市场搜索 PlantUML Integration 并安装&#xff0c;重启 WebStorm 使插件生效。 2. 安装 Graphviz PlantUML 需要 Graphviz 来生成图形。使用 Homebrew 安装 Graphviz&#xff1a; 打开终端&#xff08;Terminal&#xff09;。确保你…

java的Nio演进

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 java的Nio演进 前言简介正文总结 前言 在JDK1.4推出JavaNIO之前,基于Java的所有Socket通信都采用了同步阻塞模式 (BIO),这种一请求一应答的通信模型简化了上层的应用开发,但…