java数据结构1------深入学习ArrayList

news2024/11/25 7:24:23

目录

一、概念

二、源码分析

1、属性

2、构造器

 ①空构造

②指定初始容量(initialCapacity)构造器

②参数为Collection的构造器

3、常用方法

①public boolean add(E e)

②public void add(int index, E element)

③其他方法

三、总结


一、概念

java.util.ArrayList 是Java中的常用类,它实现了List接口,能够存储任意类型的数据。ArrayList底层是通过数组实现的,因此它具有快速随机访问的特性。

二、源码分析

1、属性

DEFAULT_CAPACITY(默认容量)是一个常量10

EMPTY_ELEMENTDATA 与 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 都是常量空集合

elementData 是ArrayList内部维护的数组

size为ArrayList的长度

2、构造器

    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }


    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);
        }
    }

    public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // replace with empty array.
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }
 ①空构造

将维护的数组(elementData)赋值为DEFAULTCAPACITY_EMPTY_ELEMENTDATA

②指定初始容量(initialCapacity)构造器

initialCapacity为负数抛出异常

initialCapacity为0,将维护的数组(elementData)赋值为空集

initialCapacity为正数,将维护的数组(elementData)赋值为长度为initialCapacity的数组

②参数为Collection的构造器

1、通过参数获取新的数组赋值给维护的数组(elementData)

2、将size刷新并判断长度,为零则与new ArrayList(0)一样处理(将维护的数组(elementData)赋值为空集)不为零并且判断不是

Object[]类型,则变为Object[]类型。

3、常用方法

①public boolean add(E e)
    //添加单个元素
    public boolean add(E e) {
        //确保容量够用
        ensureCapacityInternal(size + 1); 
        //赋值
        elementData[size++] = e;
        return true;
    }

    //确保容量够用,参数是最小容量条件
    private void ensureCapacityInternal(int minCapacity) {
        //计算容量后确定容量
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }

    //计算容量
    private static int calculateCapacity(Object[] elementData, int minCapacity) {
        //前面讲过,如果是空构造即new ArrayList(),就会赋值DEFAULTCAPACITY_EMPTY_ELEMENTDATA
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            //默认容量与最小容量条件对比,返回大的
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }

    //确定容量,参数是最小容量条件
    private void ensureExplicitCapacity(int minCapacity) {
        //添加、删除、修改等操作时,modCount的值就会增加,modCount主要目的就是用来限制用户在迭代时修改列表,造成数据错乱
        modCount++;

        //若计算的容量大于实际容量则扩容
        if (minCapacity - elementData.length > 0
            grow(minCapacity);
    }

    //扩容
    private void grow(int minCapacity) {
        // 现在维护的数组的容量
        int oldCapacity = elementData.length;
        // 新容量为之前的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        // 新容量若不够,使用需求容量
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        // 这里一定要用减法,不是直接比较大小(可以想新容量负数时)
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // 扩容到指定大小
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
②public void add(int index, E element)
    public void add(int index, E element) {
        //检查此下标是否存在
        rangeCheckForAdd(index);
        //确定容量
        ensureCapacityInternal(size + 1);  
        //将index开始到最后的元素都向后复制到下一位
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        //赋值
        elementData[index] = element;
        size++;
    }
③其他方法
public E get(int index): 1、检查index是否合理  2、直接在维护的数组中查index 返回
public E remove(int index):1、检查index是否合理  2、通过System.arraycopy把index后面每个元素向前移动一位 3、把末尾赋值null,size减1
public E set(int index, E element): 1、检查index是否合理 2、直接在维护的数组对下标为index的元素赋值

由于过于简单,这里不再列举

三、总结

ArrayList底层是基于数组实现的,在new ArrayLIst()后容量是0,在添加第一个元素时会默认容量为10,扩容时默认扩容到原来的1.5倍。

ArrayList的扩容机制是通过拷贝数组实现的,删除某个元素是也要进行大量拷贝,所以插入元素或者删除某个元素时效率会很低,而在查询或者更新是效率很高。

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

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

相关文章

【ARM AMBA5 CHI 入门 12 -- CHI 总线学习 】

文章目录 介绍CHI 特点Layers of the CHI architectureTopology Node TypeTransaction 分类Transaction 路由SAM 介绍Node ID 节点间数据怎么传输的呢&#xff1f; 介绍 CHI 的全称是 Coherent Hub Interface。所以从名字就能看出&#xff0c;CHI要解决什么问题了。按照惯例&a…

思维导图怎么变成ppt?4个思维导图一键生成ppt的方法

做好的思维导图如何变成一份ppt&#xff1f;本文罗列了4个可行方法&#xff0c;一起来看看吧。 一 直接复制粘贴 这是最简单的方法&#xff0c;虽然这样可能会花费一些时间&#xff0c;但可以确保内容排版和布局与你想要的一致。当然&#xff0c;我们大可使用更高效的方法。…

NLP(2)--Transformer

目录 一、Transformer概述 二、输入和输出 三、Encoder 四、Decoder 五、正则化处理 六、对于结构的改进&#xff1f; 七、AT vs NAT 八、Cross-attention 一、Transformer概述 Transformer模型发表于2017年Google团队的Attention is All you need这篇论文&#xff0c;…

七、SSM 框架整合

目前已经学习了 MyBatis 框架&#xff0c;Spring 框架&#xff0c;以及Spring MVC 框架。现阶段学习将这三个框架整合到一起&#xff0c;实现简单的前后端交互的曾删改差功能页面。 Mybatis 框架主要负责数据库的操作问题&#xff0c;以及数据回显。该框架将 SQL 与 Jav…

Browserslist 信息和配置使用整理

我们可以在各种前端工程看到 Browserslist 的配置身影&#xff0c;看似简单但实际上可能会有暗坑导致线上兼容问题&#xff0c;借此文来整理下 Browserslist 的信息。 Browserslist 是由 Autoprefixer 团队维护的一个开源项目&#xff0c;用于自动处理 CSS 和 JavaScript 文件…

opencv识别一张图片的多个红框,并截取红框的内容

需求 需要获取图片的红框的内容&#xff0c;实体的图片我就不放了 获取红框 先截取获得图片的多个轮廓 import cv2 import numpy as np # 加载图像并转换为灰度图像 image cv2.imread(image6.jpg) gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 应用高斯模糊以减…

基本的 Linux 命令以及 Linux 目录结构

目录 什么是Linux&#xff1f; ls - 列出文件和目录 pwd - 显示当前工作目录 cd - 切换目录 mkdir - 创建目录 touch - 创建空文件 rm - 删除文件和目录 cp - 复制文件和目录 mv - 移动和重命名文件和目录 文件系统基础 Linux 操作系统是开源且强大的操作系统&…

流媒体之推流和拉流

推流&#xff1a;将直播内容推送至服务器的过程 拉流&#xff1a;为服务器已有直播内容&#xff0c;用指定地址进行拉取的过程 什么是推流&#xff1f; 推流&#xff0c;指的是把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号传到网络的过程。“推流”…

D. Sorting By Multiplication(贪心)

Problem - D - Codeforces 给定一个长度为n的数组a&#xff0c;由正整数组成。 您可以对该数组执行以下操作任意次数&#xff08;可能为零&#xff09;&#xff1a; 选择三个整数l、r和x&#xff0c;使得1≤l≤r≤n&#xff0c;并将满足l≤i≤r的每个ai乘以x。 请注意&#…

操作系统内存(32位为例)

0、OS能使用最大的虚拟内存和物理内存 最大的虚拟内存与寻址总线有关。一般是40根&#xff0c;对应256T 最大的物理内存与PTE的位数有关。 10-10-12分页模式下是32位&#xff0c;所以最大寻址空间就4G 1、CPU分页模式 分类 还有5-level&#xff0c;一般适用于大型服务器。…

【Springcloud】Seata分布式事务

【Springcloud】Seata分布式事务 【一】基本介绍&#xff08;1&#xff09;什么是分布式事务&#xff08;2&#xff09;为什么要使用分布式事务&#xff08;3&#xff09;seata分布式事务 【二】下载方式【1】Windows平台安装包下载 【三】如何使用【1】创建相关测试数据库和表…

每日刷题-1

目录 一、选择题 二、编程题 1、组队竞赛 2、删除公共字符 一、选择题 1、 解析&#xff1a;%s遇到\0会停止&#xff0c;%m.ns中m表示字符串宽度&#xff0c;n表示左起取目标字符串n个字符&#xff0c;右对齐&#xff0c;&#xff08;如果想要左对齐&#xff0c;可以写成%-m.n…

【C++学习笔记】5、变量作用域

文章目录 【 1、局部变量 】【 2、全局变量 】【 3、局部变量和全局变量的初始化 】 作用域是程序的一个区域&#xff0c;一般来说有三个地方可以定义变量&#xff1a; 在函数或一个代码块内部声明的变量&#xff0c;称为局部变量。 在函数参数的定义中声明的变量&#xff0c;称…

【LeetCode】剑指 Offer <二刷>(2)

目录 题目&#xff1a;剑指 Offer 04. 二维数组中的查找 - 力扣&#xff08;LeetCode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 05. 替换空格 - 力扣&#xff0…

【ROS 05】ROS常用组件

在ROS中内置一些比较实用的工具&#xff0c;通过这些工具可以方便快捷的实现某个功能或调试程序&#xff0c;从而提高开发效率&#xff0c;本章主要介绍ROS中内置的如下组件: TF坐标变换&#xff0c;实现不同类型的坐标系之间的转换&#xff1b;rosbag 用于录制ROS节点的执行过…

基于springboot实现了后台定时统计数据报表并将数据生成excel文件作为附件,然后通过邮件发送通知的功能

概述 本例子基于springboot实现了后台定时统计数据报表并将数据生成excel文件作为附件&#xff0c;然后通过邮件发送通知的功能。 详细 一、准备工作 1、首先注册两个邮箱&#xff0c;一个发送邮箱&#xff0c;一个接收邮箱。 2、发送邮箱开启IMAP/SMTP/POP3服务&#xff0c…

服务器间 ssh 免密登录

1、在所有服务器生产密钥文件 ssh-keygen -t rsa一直空格就可以 2、查看所有节点的公钥文件 cat /home/bigdata/.ssh/id_rsa.pub3、将所有节点的公钥文件写入到authorized_keys文件中 4、将authorized_keys文件分发给其他节点并修改权限 #注意查看authorized_keys文件的权…

131.【MySQL_基础篇】

MySQL_基础篇 (一)、MySQL 介绍1.MySQL三大阶段(1).基础篇(2).进阶篇(3).运维篇 2.MySQL 概念3.数据模型(1).关系型数据库(RDBMS) 4.数据库三大范式 (二)、SQL 编程语言1.SQL通用语法2.SQL 四大分类3.DDL (数据定义语言)(1).数据库操作 ->(增删改查)(2).表操作 -> (增删改…

整数拆分【动态规划】

整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 class Solution {public int integerBreak(int n) {int[] dp new int[n 1];//正整数&#x…

day 48|● 583. 两个字符串的删除操作 ● 72. 编辑距离

583. 两个字符串的删除操作 dp的含义&#xff1a;指0开头&#xff0c;i- 1和j - 1为结尾的两个序列的删除最小数 递推公式方面&#xff1a; 初始化方面&#xff1a;前面0行和0列的初值要赋好 func minDistance(word1 string, word2 string) int {dp : make([][]int, len(wor…