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) {
        // 定义并初始化一个 ArrayList
        ArrayList<String> list1 = new ArrayList<>();
        
        // 添加元素
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");
        
        // 输出 ArrayList
        System.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 来实现各种需求。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《模拟联合国2.9—团队协作》

感谢上海财经大学持续的邀请&#xff0c;今天在阶梯教室举办的《模拟联合国2.0—团队协作》沙盘课程圆满结束。尽管场地的限制带来了一定的挑战&#xff0c;但得益于系统思考中“结构影响行为”的原则&#xff0c;我得以在不同场景中巧妙设计课程结构&#xff0c;极大地促进了大…

【SEMI-e ·国际半导体深圳展】| 06月26-28日唯创知音语音芯片供应商 邀您来观展

世界聚焦半导体&#xff0c;产业规模空前&#xff01;一场高端产业研学盛会即将如约而至。 SEMI-e 第六届2024国际半导体展深圳站&#xff0c;2024年06月26-28日将在深圳国际会展中心&#xff08;宝安&#xff09;开展&#xff0c;展会展出面积60000平方米&#xff0c;汇聚全国…

Python | Leetcode Python题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; class MinStack:def __init__(self):self.stack []self.min_stack [math.inf]def push(self, x: int) -> None:self.stack.append(x)self.min_stack.append(min(x, self.min_stack[-1]))def pop(self) -> None:self.stack.pop()sel…

Java+ffmpeg 合并两个mp4文件

使用ffmpeg测试命令 ffmpeg -i "E:\Monitor\video_20240617_10.mp4" -i "E:\Monitor\video1_20240617_10.mp4" -filter_complex "[0:v][0:a][1:v][1:a]concatn2:v1:a1[v][a]" -map "[v]" -map "[a]" -c:v libx264 -c:a…

5点小技巧教你如何做一个成功的亚马逊VC卖家

亚马逊Vendor Central&#xff08;VC&#xff09;是卖家与亚马逊直接合作的重要平台&#xff0c;为卖家提供了更多的销售机会和更稳定的销售渠道。那么&#xff0c;如何在这个平台上脱颖而出&#xff0c;成为一个成功的亚马逊VC卖家呢&#xff1f; 以下是五个小技巧供您参考&am…

NebulaGraph 知识图谱数据库使用:nebula数据库连接使用

参考:https://github.com/vesoft-inc/nebula-python/blob/master/example/GraphClientSimpleExample.py 文档&#xff1a;https://docs.nebula-graph.com.cn/3.4.1/3.ngql-guide/7.general-query-statements/2.match/#_4 pip install nebula3-python1&#xff09;查询的节点&…

人工智能的头号威胁:投毒攻击

随着掌管数字生活入口的万亿美元俱乐部企业——苹果公司跳入人工智能&#xff08;AI&#xff09;赛道&#xff0c;AI技术民主化的大幕正式拉开&#xff0c;同时也将AI安全问题推向舆论的风口浪尖。 根据瑞银本周一的智能手机调查报告&#xff0c;在中国以外的智能手机用户中&am…

Vue63-配置代理-方式二

一、请求前缀&#xff1a;能灵活的控制走不走代理 1-1、请求前缀 有请求前缀的走代理服务器&#xff1b; 没有请求前缀的不走代理服务器。 修改代码中的请求地址&#xff0c;加上请求前缀 报错的原因&#xff1a; 解决方式&#xff1a; 1-2、ws配置项、changeOrigin配置项 二…

redis-实战篇(1)短信登录

黑马redis-实战篇笔记 开篇导读 亲爱的小伙伴们大家好&#xff0c;马上咱们就开始实战篇的内容了&#xff0c;相信通过本章的学习&#xff0c;小伙伴们就能理解各种redis的使用啦&#xff0c;接下来咱们来一起看看实战篇我们要学习一些什么样的内容 短信登录 这一块我们会使…

利用LinkedHashMap实现一个LRU缓存

一、什么是 LRU LRU是 Least Recently Used 的缩写&#xff0c;即最近最少使用&#xff0c;是一种常用的页面置换算法&#xff0c;选择最近最久未使用的页面予以淘汰。 简单的说就是&#xff0c;对于一组数据&#xff0c;例如&#xff1a;int[] a {1,2,3,4,5,6}&#xff0c;…

Linux - 输入输出

一、输出格式 echo //末尾自带换行 -n //取消自带换行 -e //支持转移符 常见转义符 \n换行 \t制表符 printf // 格式化输出字符串 %-10s // %s代表字符串 -10 左对齐容纳10个字符 二、输入输出重定向 file descriptors &#x…

leetcode (top100)接雨水

题目&#xff1a; 题解&#xff1a; 可以把每个宽度看作一个桶&#xff0c;每个桶能接的水等于这个桶左右两个方向最高桶的最小高度再减去这个桶本身的高度。把每个桶能接的水相加即可。 难点在于如何快速找到当前桶的左右两个方向的最高桶的高度&#xff0c;可以先遍历一遍…

LangChain入门到精通,看这这篇吊打面试官

导语 在人工智能领域的不断发展中&#xff0c;语言模型扮演着重要的角色。特别是大型语言模型&#xff08;LLM&#xff09;&#xff0c;如ChatGPT&#xff0c;已经成为科技领域的热门话题&#xff0c;并受到广泛认可。在这个背景下&#xff0c;LangChain作为一个以LLM模型为核…

什么是元数据管理?企业进行元数据管理可以满足什么目的?

元数据管理作为数据治理的重要组成部分&#xff0c;其作用日益凸显。元数据&#xff0c;即“关于数据的数据”&#xff0c;提供了对数据的描述、上下文和意义的详细信息&#xff0c;对于确保数据的准确性、一致性和可访问性至关重要。 有效的元数据管理能够帮助企业更好地理解…

数位统计DP——AcWing 338. 计数问题

数位统计DP 定义 数位DP&#xff08;Digital DP&#xff09;是一种用于解决与数字的数位相关问题的动态规划算法。它将数字的每一位看作一个状态&#xff0c;通过转移状态来计算满足特定条件的数字个数或其他相关统计信息。 运用情况 统计满足特定条件的数字个数&#xff0…

好用的抖音短视频矩阵系统推荐:筷子剪辑,超级编导。抖去推

目前短视频矩阵行业如火如荼&#xff0c;为大家推荐几款比较好用的短视频矩阵系统。 第一款叫做筷子剪辑&#xff0c;由筷子科技开发&#xff0c;网页版应用工具&#xff0c;无需下载安装 主打视频剪辑&#xff0c;支持一键成片&#xff0c;视频发布等&#xff0c;&#xff0…

SAP赋能食品行业,确保安全与品质的双重飞跃

品安全与品质是消费者最关心的问题&#xff0c;也是食品企业的生命线。随着科技的发展和消费者需求的日益多样化&#xff0c;食品行业正面临着前所未有的挑战和机遇。SAP作为全球领先的企业资源规划&#xff08;ERP&#xff09;系统&#xff0c;为食品行业提供了全面的解决方案…

基于STC12C5A60S2系列1T 8051单片机接收串口调试助手发送的固定长度字符串控制单片机的功能

基于STC12C5A60S2系列1T 8051单片机接收串口调试助手发送的固定长度字符串控制单片机的功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串口通信的特殊功能…

21.0docker企业级镜像仓库harbor(vmware 中国团队)

docker企业级镜像仓库harbor(vmware 中国团队) 网站下载harbor软件包 https://github.com/goharbor/harbor 查看软件安装harbor版本需求限制 本地环境需求已满足 点击下载harbor安装包 点击releases根据版本信息下载 下面的在线安装就是docker pull。离线就是下载之后…

Flask新手入门(一)

前言 Flask是一个用Python编写的轻量级Web应用框架。它最初由Armin Ronacher作为Werkzeug的一个子项目在2010年开发出来。Werkzeug是一个综合工具包&#xff0c;提供了各种用于Web应用开发的工具和函数。自发布以来&#xff0c;Flask因其简洁和灵活性而迅速受到开发者的欢迎。…