Java中的ArrayList类

news2024/9/20 15:00:08

继承实现关系

Arraylist就是一个可以动态扩容的容器,属于集合类的一种,要追根溯源的话它是间接实现了Collection接口,下面我画一下它的结构图

类定义

ArrayList类继承自抽象类AbstractList,同时实现了List和Collection接口,进入源码我们可以看到它的类定义

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

数据存储结构

    transient Object[] elementData;

看到源码中我们可以知道,它的底层其实是一个对象数组,我们传进去的对象都会被存放到这个数组当中去

构造器初始化方式

1.指定数组大小

 public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

这是它的构造器之一,传入一个int类型的数据,然后编译器就根据指定的大小创建相应大小的数组

ArrayList A=new ArrayList(10);

像这样既可以给它赋一个初值大小,当然后面根据加入元素的个数数组还会自动的扩容

2.无参构造器

    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

如果我们在创建对象时什么也不写,会给数组分配一个默认大小的空间即10,数组内容为空

ArrayList A=new ArrayList();//其中的数组大小默认为10

3.传入ArrayList对象初始化

    /**
     * Constructs a list containing the elements of the specified
     * collection, in the order they are returned by the collection's
     * iterator.
     *
     * @param c the collection whose elements are to be placed into this list
     * @throws NullPointerException if the specified collection is null
     */
    public ArrayList(Collection<? extends E> c) {
        Object[] a = c.toArray();
        if ((size = a.length) != 0) {
            if (c.getClass() == ArrayList.class) {
                elementData = a;
            } else {
                elementData = Arrays.copyOf(a, size, Object[].class);
            }
        } else {
            // replace with empty array.
            elementData = EMPTY_ELEMENTDATA;
        }
    }

传入一个ArrayList对象,系统会将传入的对象中的数据拷贝到新创建的数组中去,相当于拷贝一份参数中的对象

		ArrayList a1=new ArrayList();
		
		ArrayList a2=new ArrayList(a1);

类似这样,当我们想要复制一份原对象时可以这样使用

类中的常用方法

1.添加元素

(1)public boolean add(E e)

对于这个方法,我们直接使用对象调用方法,括号中传入想要插入的元素即可

		ArrayList a1=new ArrayList();
		a1.add(1);//默认插入到数组末尾

这样直接传入元素的方式系统会默认插入到数组的末尾

(2)public void add(int index, E element)

对于这个方法,我们可以指定要插入到数组中的哪个位置,当然这个index不能超出数组目前的元素个数,比如目前数组中有5个元素,那么最大index为5,即插入到最后,我们插入位置及以后的元素都会向后顺延一位

		ArrayList a1=new ArrayList();
		a1.add(1);
		a1.add(1,2);//插入到数组中下标为1的位置

像上面这样使用输出a1的结果是 1 2

2.删除元素

(1)public E remove(int index)

传入一个下标,删除指定下标处的元素

a1.remove(0);

比如这样就是删除a1中第一个元素

(2)public boolean remove(Object o)

传入要删除的对象,删除指定的对象
 

3.修改元素

public E set(int index, E element)
传入下标和新对象,将指定下标处的元素修改为传入的新对象

4.size()

返回对象中的元素数量

5.isEmpty()

判断对象元素是否为空,为空则返回true,否则返回false

6.indexOf(Object obj)

传入一个对象,返回数组中该对象第一次出现的位置,若找不到返回-1

7.lastIndexOf(Object obj)

传入一个对象,返回数组中该对象最后一次出现的位置,若找不到返回-1

好了以上是一些常用的方法,当然ArrayList还有一些非常使用的方法比如sort等,需要用到朋友去别处搜索把这里不在展开讲了。

总结

集合其实就是更方便的数组,我们在使用时不需要考虑它的大小,只需要调用类的接口实现就可以了,方便我们开发需要的功能,不必在细节上犯难,这是它的好处。

但是还是推荐有兴趣的小伙伴去看一下它的源码,它的底层代码设计的非常巧妙。

后面我会继续出一些集合类的结构梳理,如LinkedList、Vector还有Map的一些类,如果觉得本期内容写的还不错希望可以给我点个赞

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

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

相关文章

服务器数据恢复—通过拼接数据库碎片的方式恢复SQL Server数据库数据

服务器数据恢复环境&#xff1a; 一台服务器中有一组由4块STAT硬盘通过RAID卡组建的RAID10阵列&#xff0c;上层是XenServer虚拟化平台&#xff0c;虚拟机安装Windows Server操作系统&#xff0c;作为Web服务器使用。 服务器故障&#xff1a; 因机房异常断电导致服务器中一台V…

元学习之应用案例

现在在做元学习的时候&#xff0c;我们最常拿来测 试元学习技术的任务叫做少样本图像分类&#xff0c;简单来讲就是每一个任务都只有几张图片&#xff0c;每一 个类别只有几张图片。比如我们使用图1的案例为例说明。现在分类的任务是分为三个 类别&#xff0c;每个类别都只有两…

贪心-用最少的箭射球

一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭&#xff0c;若有一个气球的直径的开始和结束坐标为 xstart&#xff0c;xend&#xff0c; 且满足 xstart ≤ x ≤ xend&#xff0c;则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后…

MySQL从C盘迁移到D盘

文章目录 前言一、停止MySQL服务打开服务&#xff08;方式一&#xff09;打开服务&#xff08;方式二&#xff09;停止MySQL服务 二、找到C盘中的文件文件夹1文件夹2文件夹3 三、修改文件内容1.对应文件夹12.对应文件夹3 四、 修改注册表中文件路径1.打开注册表2. 修改注册表中…

微积分-积分应用5.5(函数的平均值)

很容易计算有限多个数字 y 1 , y 2 , … , y n y_1, y_2, \dots, y_n y1​,y2​,…,yn​ 的平均值&#xff1a; y ave y 1 y 2 ⋯ y n n y_{\text{ave}} \frac{y_1 y_2 \cdots y_n}{n} yave​ny1​y2​⋯yn​​ 但是&#xff0c;如果可以进行无限多次的温度读取&…

Java 入门指南:Java 并发编程 —— 同步工具类 CountDownLatch(倒计时门闩)

文章目录 同步工具类CountDownLatch常用方法使用步骤适用场景使用示例 同步工具类 JUC&#xff08;Java.util.concurrent&#xff09;是 Java 提供的用于并发编程的工具类库&#xff0c;其中包含了一些通信工具类&#xff0c;用于在多个线程之间进行协调和通信&#xff0c;特别…

【kafka】kafka如何保证数据的可靠性,kafka如何保证数据不丢失

1. Kafka架构&#xff1a; Producer - Broker - Consumer 回到问题上来&#xff0c;Kafka如何保证数据不丢失&#xff0c;我们先看看Kafka如何保证Producer端数据不丢失&#xff1a; 通过ack机制 最小副本数设置 生产者重试机制 2. Kafka Producer消息发送ACK机制&#xff1…

量化交易backtrader实践(一)_数据获取篇(2)_tushare与akshare

上一节回顾 在上一节中&#xff0c;从股票的基本功能和主要数据进行小结&#xff0c;明确了进行backtrader回测所需要的数据&#xff0c;并且学习了backtrader的数据来源以及PandasData的格式要求&#xff0c;已经做到假设拿到.txt或.csv文件后&#xff0c;能把里面的股票基本…

【代码随想录】字符串

本博文为《代码随想录》学习笔记&#xff0c;原文链接&#xff1a;代码随想录 344.反转字符串 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的…

Qt使用绿色pdf阅读器打开文件

1.下载SumatraPDF 2.设置 3.代码 void MainWindow::on_pushButton_clicked() {QProcess *process new QProcess();QString filePath "C:\\Users\\jude\\Desktop\\su\\11.pdf";QString sumatraPath "C:\\Users\\jude\\Desktop\\su\\SumatraPDF-3.5.2-64.exe&q…

Android 系统级应用守护进程

import java.util.Random; /** Application class for SystemUI. -42,6 69,8 public class SystemUIApplication extends Application { private static final String TAG “SystemUIService”; private static final boolean DEBUG false; private Context mContext;/*…

嵌入式产品发货后出现问题,怎么办?

目录 1、问题识别与初步诊断 2、影响评估 3、提出临时解决方案 4、根本原因分析与修复 5、修复验证与回归测试 6、修复的部署与客户沟通 7、预防未来类似问题 当嵌入式电子产品已发货且出现问题时&#xff0c;及时采取有效的补救措施是至关重要的。补救步骤应包括问题的…

javascript柯里化

return a b c d; } //通常调用方式 var sum add(1, 2, 3, 4); //柯里化的调用方式 var curryAdd Curry(add); var sum curryAdd(1)(2)(3)(4); //或者很多奇怪的方式调用 var sum curryAdd(1, 2)(3, 4); var sum curryAdd(1, 2, 3)(4); var sum curryAdd(1)(…

C语言 | Leetcode C语言题解之第398题随机数索引

题目&#xff1a; 题解&#xff1a; typedef struct {int *nums;int numsSize; } Solution;Solution* solutionCreate(int* nums, int numsSize) {Solution *obj (Solution *)malloc(sizeof(Solution));obj->nums nums;obj->numsSize numsSize;return obj; }int solu…

Maven之坑setting.xml配置

先来看遇到的问题 在运行 mvn clean package 打包命令的时候&#xff0c;IDEA控制台提示如下 Non-resolvable parent POM for com.xxxxx.xxxxx:1.0.0: The following artifacts could not be resolved: com.xxxxx:xxxxx:pom:1.0.0 (present, but unavailable): xxxxx:xxxxx…

全球热门剪辑软件大搜罗

如果你要为你的视频进行配音那肯定离不开音频剪辑软件&#xff0c;现在有不少音频剪辑软件免费版本就可以实现我们并不复杂的音频剪辑操作。这次我就给你分享几款能提高剪辑效率的音频剪辑工具。 1.福晰音频剪辑 链接直达>>https://www.foxitsoftware.cn/audio-clip/ …

Java面试篇基础部分-Java各种垃圾收集器

导语   在之前的分享中,我们知道Java堆内存被分为新生代和老年代两个部分;其中,新生代中主要存储生命周期较短的对象,了解了新生代中的对象采用的是复制算法进行垃圾回收;而老年代主要存储生命周期较长的对象以及大对象,采用的是标记整理算法进行垃圾回收。 针对不同的…

Es6解构赋值,熟练掌握作用域

5.3 数组的解构赋值 数组的解构赋值是按照前后数据的索引值一一对应的 5.4 前后数据结构也要保持一致,不然解构的可能与原数组解构嵌套不同 5.5 数组解构时的默认值 6 对象的解构赋值 对象的解构赋值是按照key一一解构 7 解构数组,如果有两个值必须写在后面,rest参数 8 解…

VMware账户授权迁移Broadcom账户-操作指南

前言: VMware被Broadcom收购后,大量的国内VMware企业用户获取技术支持的渠道改变。 特别是授权以及开Case的问题。 这篇文章保姆级教学,从你怎么拨打外国电话(并且告诉你背诵英文短语的方式从400处获取答案,不用交流),怎么获取Site ID,以及如何…

湖仓一体-Paimon篇-简介

简介 Apache Paimon 是一种数据湖的格式&#xff0c;支持使用 Flink 和 Spark 构建实时湖仓架构&#xff0c;用于流式和批处理操作。Paimon 创新性地结合了数据湖格式和LSM结构&#xff0c;将实时流式更新引入数据湖架构。 Paimon 提供以下核心功能&#xff1a; ● 实时更新&a…