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;数据定义语言…

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

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

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

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

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

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

JavaScript的学习之事件的简介

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

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

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

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

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

WebStorm 配置 PlantUML

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

C语言小例程28/100

题目&#xff1a;利用递归方法求5!。 程序分析&#xff1a;递归公式&#xff1a;fnfn_1*4! #include <stdio.h>int main() {int i;int fact(int);for(i0;i<6;i){printf("%d!%d\n",i,fact(i));} } int fact(int j) {int sum;if(j0){sum1;} else {sumj*fac…

闪迪sd卡视频格式化数据恢复方法,你了解吗

咨询&#xff1a;“我不小心将闪迪SD卡格式化了&#xff0c;里面的重要视频文件全都不见了。我感到非常焦虑&#xff0c;因为这些视频对我来说意义非凡。现在急需找到方法来恢复&#xff01;&#xff01;” 在数字时代&#xff0c;SD卡已成为我们日常生活中不可或缺的数据存储设…

python中数据的作用域

一、命名空间 在 Python 中&#xff0c;命名空间是一个系统&#xff0c;它用于确保名字的唯一性&#xff0c;并防止命名冲突。命名空间是一个存储变量名称&#xff08;或者更广泛地说&#xff0c;标识符&#xff09;与对象之间映射的抽象概念。每个变量名你在程序中创建&#x…

msvcp120.dll丢失怎么办,找不到msvcp120.dll的多种解决方法

最近&#xff0c;我在运行一个程序时遇到了一个错误&#xff0c;系统提示找不到msvcp120.dll文件&#xff0c;无法继续执行代码。这让我感到非常困扰&#xff0c;因为这个问题导致我无法正常运行这个程序。经过一番搜索和尝试&#xff0c;我找到了几种修复这个问题的方法&#…

如何开发、使用 Starter

开发 第一步&#xff1a;创建starter工程hello-spring-boot-starter并配置pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchem…

SpringBoot优点达项目实战:项目初始化(一)

SpringBoot优点达项目实战&#xff1a;项目初始化&#xff08;一&#xff09; 文章目录 SpringBoot优点达项目实战&#xff1a;项目初始化&#xff08;一&#xff09;1、项目介绍2、项目搭建3、依赖导入4、数据准备 1、项目介绍 技术框架 SpringbootmybatisPlusvueknife 2、项目…

创建App

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Django项目中&#xff0c;推荐使用App来完成不同模块的任务&#xff0c;通过执行如下命令可以启用一个应用程序。 python manage.py startapp app…

RT-Thread的Finsh实现学习

学习原因 工作中&#xff0c;使用同事开发的调试软件&#xff0c;输入参数打印的函数名就可以打印参数&#xff0c;但看不到代码实现&#xff0c;只能用自己微薄的知识积累去猜一下&#xff0c;之前尝试过&#xff0c;专门写一个函数&#xff0c;去解析编译生成的map文件&#…

名侦探李先生第一话:谁是真正的凶手(只出现一次的数字相关题解(力扣)+位操作符回忆)

引子&#xff1a;我们在之前的案子中破解过基础的单身狗问题&#xff0c;那面对更有挑战的案子&#xff0c;且看李先生如何破局&#xff0c;那下凶手&#xff01; 复习&#xff1a; 1&#xff0c;位操作符&#xff1a; 正整数原&#xff0c;反&#xff0c;补码都相同 首位是…

RocketMQ如何添加JVM监控

这里是小奏,觉得文章不错可以关注公众号小奏技术 JVM监控选型 本次JVM监控我们采用prometheus官方提供的jmx_exporter来实现 RocketMQJVM开发 整体目录 1. 新增agent目录 我们在distribution目录新增一个agent模块&#xff0c;然后添加两个文件 jmx_prometheus_javaagent-…