【数据结构】- 数组

news2025/1/11 7:46:01

数组

  • 基础
    • 1.1 什么是数组
    • 1.2 数组特点
      • 无法动态修改容量
      • 内存中顺序存储
  • 2. 基本操作
    • 2.1 结构
    • 2.2 添加元素 - add(E element)、add(int index, E element)
      • 代码实现
    • 2.3 删除元素 - remove(int index)、清空数组 - clear()
      • 代码实现
    • 2.4 扩容 - ensureCapacity(int capacity)
  • 3. 代码

基础

1.1 什么是数组

数组是一种顺序存储的线性表,所有元素的内存地址是连续的。
在这里插入图片描述

1.2 数组特点

无法动态修改容量

内存中顺序存储

2. 基本操作

2.1 结构

在这里插入图片描述

2.2 添加元素 - add(E element)、add(int index, E element)

add(E element):默认往数组最后添加元素。
在这里插入图片描述
add(int index, E element):在 index 位置插入一个元素
比如在index=2的位置插入元素,从后往前开始将 index = 2 以后的元素依次后移,然后赋值:
在这里插入图片描述
如果从前往后开始移动元素,会造成如下错误的后果:
、

代码实现

   /**
     * 队尾插入元素
     * @param e 插入的元素
     */
    public void add(E e) {
        add(size, e);
    }

    /**
     * 指定插入元素
     * @param index 插入的位置
     * @param e 插入的元素
     */
    public void add(int index, E e) {
        // 检查下标
        rangeCheckForAdd(index);
        // 确保容量够大,容量不足的话,1.5倍扩容
        ensureCapacity(size + 1);

        // 0 1 2 3 4 5 6 7 8 9	(index)
        // 1 2 3 4 5 6 x x x x	(原数组)
        // 在index=2处,插入9,元素全部后移
        // 1 2 9 3 4 5 6 x x x	(add后数组)
        // 先从后往前开始, 将每个元素往后移一位, 然后再赋值
        // size-1(最后一个元素) ---> index(index位置也要移走)
        for (int i = size - 1; i >= index; i--) {
            elementData[i + 1] = elementData[i];
        }
        elementData[index] = e;
        size++;
    }

2.3 删除元素 - remove(int index)、清空数组 - clear()

例如,删除 index = 3 的数组元素,应当从前往后开始移动,用后面的元素覆盖前面的元素。
在这里插入图片描述

代码实现

 //清除所有元素 - clear()
    public void clear() {
       // 使用泛型数组后要注意内存管理(将元素置null)
		for (int i = 0; i < size; i++) {
			elements[i] = null;
		}
		size = 0;
    }

    /**
     * 清除指定位置元素
     * @param index 删除的元素位置
     * @return
     */
    public E remove(int index) {
        //检查下标
        rangeCheckForAdd(index);

        //要被删除的元素,用于return
        E old = (E) elementData[index];

        // 0 1 2 3 4 5 	(index)
        // 1 2 3 4 5 6 	(原数组)
        // 删除index为2的元素,元素前移
        // 1 2 4 5 6	(remove后的数组)
        // 从前往后开始移, 用后面的元素覆盖前面的元素
        // 1. index(第一个元素被覆盖的元素) ---> size-(倒数第二个元素是最后一个被移除的元素)
        for (int i = index; i <= size - 1; i++) {
            elementData[i] = elementData[i + 1];
        }
        // 2. 此时,最后一个元素已经被放到倒数第二个元素的位置了,这时候,最后一个元素置为null就可以
        elementData[size - 1] = null;
        size--;

        return old;
    }

2.4 扩容 - ensureCapacity(int capacity)

在这里插入图片描述

  /*
     * 扩容操作
     */
    private void ensureCapacity(int capacity) {
        int oldCapacity = elementData.length;
        if (oldCapacity >= capacity) {
            return;
        }

        int newCapacity = oldCapacity + (oldCapacity >> 1); // 1.5
        Object[] newElementData = new Object[newCapacity];
        // 新容量为旧容量的1.5倍
        System.arraycopy(elementData, 0, newElementData, 0, elementData.length);
        System.out.println("size=" + oldCapacity + ", 扩容到了" + newCapacity);

        //底层
        //for (int i = 0; i < size; i++) {
        //  newElementData[i] = elementData[i];
        //}
        //elements = newElements;
    }

3. 代码

public class ArrayList<E> {
    private Object[] elementData;   //元素存放位置
    public int size;    //元素数量

    private static final int DEFAULT_CAPACITY = 10; //初始容量

    public ArrayList(int size) {
        size = (size < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : size;
        elementData = new Object[size];
    }

    public ArrayList() {
        this(DEFAULT_CAPACITY);
    }

    //读取元素
    public E get(int index) {
        return (E) elementData[index];
    }

    /**
     * 队尾插入元素
     *
     * @param e 插入的元素
     */
    public void add(E e) {
        add(size, e);
    }

    /**
     * 指定插入元素
     *
     * @param index 插入的位置
     * @param e     插入的元素
     */
    public void add(int index, E e) {
        // 检查下标
        rangeCheckForAdd(index);
        // 确保容量够大,容量不足的话,1.5倍扩容
        ensureCapacity(size + 1);

        // 0 1 2 3 4 5 6 7 8 9	(index)
        // 1 2 3 4 5 6 x x x x	(原数组)
        // 在index=2处,插入9,元素全部后移
        // 1 2 9 3 4 5 6 x x x	(add后数组)
        // 先从后往前开始, 将每个元素往后移一位, 然后再赋值
        // size-1(最后一个元素) ---> index(index位置也要移走)
        for (int i = size - 1; i >= index; i--) {
            elementData[i + 1] = elementData[i];
        }
        elementData[index] = e;
        size++;
    }

    //清除所有元素 - clear()
    public void clear() {
        elementData = null;
        size = 0;
    }

    /**
     * 清除指定位置元素
     *
     * @param index 删除的元素位置
     * @return
     */
    public E remove(int index) {
        //检查下标
        rangeCheckForAdd(index);

        //要被删除的元素,用于return
        E old = (E) elementData[index];

        // 0 1 2 3 4 5 	(index)
        // 1 2 3 4 5 6 	(原数组)
        // 删除index为2的元素,元素前移
        // 1 2 4 5 6	(remove后的数组)
        // 从前往后开始移, 用后面的元素覆盖前面的元素
        // 1. index(第一个元素被覆盖的元素) ---> size-(倒数第二个元素是最后一个被移除的元素)
        for (int i = index; i <= size - 1; i++) {
            elementData[i] = elementData[i + 1];
        }
        // 2. 此时,最后一个元素已经被放到倒数第二个元素的位置了,这时候,最后一个元素置为null就可以
        elementData[size - 1] = null;
        size--;

        return old;
    }

    /*
     * 扩容操作
     */
    private void ensureCapacity(int capacity) {
        int oldCapacity = elementData.length;
        if (oldCapacity >= capacity) {
            return;
        }

        int newCapacity = oldCapacity + (oldCapacity >> 1); // 1.5
        Object[] newElementData = new Object[newCapacity];
        // 新容量为旧容量的1.5倍
        System.arraycopy(elementData, 0, newElementData, 0, elementData.length);
        System.out.println("size=" + oldCapacity + ", 扩容到了" + newCapacity);
        elementData = newElementData;
        //底层
        //for (int i = 0; i < size; i++) {
        //  newElementData[i] = elementData[i];
        //}
        //elements = newElements;

    }

    // 检查add()的下标越界(可以在size位置添加)
    private void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
        }
    }
}

视频链接找不到了,
参考博客:https://blog.csdn.net/weixin_43734095/article/details/104598981

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

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

相关文章

[附源码]Python计算机毕业设计SSM基于移动端的药方收集系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

在Mac系统下搭建Selenium环境并驱动Chrome浏览器

本文带领那些使用Mac的童鞋们实现Selenium驱动Chrome浏览器&#xff0c;虽然会有坑&#xff0c;但是我们可以凭借敏捷的身手躲过。下面就开始吧&#xff1a; 安装selenium 打开终端 ->pip安装&#xff08;安装命令&#xff1a;pip3 install selenium&#xff09; 安装浏览…

windows 安装paddleocr(CPU)

下载anaconda 注意需要下载64位&#xff08;x86_64结尾的版本) https://mirrors.bfsu.edu.cn/anaconda/archive/ conda create -n OCR python3.9成功 conda activate OCR添加环境变量&#xff0c;cmd才可以识别conda 安装paddlepaddle(有独立显卡的才能安装GPU版本&#x…

双十二电容笔啥牌子好?十大电容笔知名品牌

要为ipad配备一款电容笔&#xff0c;如果你觉得苹果原装的电容笔的价格要比你的预算高得多。而平替电容笔&#xff0c;就是最好的选择了。可以想象&#xff0c;一支原版的苹果电脑容&#xff0c;可以买四支平替电容笔&#xff0c;而平替电容笔的性能并不比苹果的电容笔差多少。…

期末前端web大作业:餐饮美食网站设计与实现——HTML+CSS+JavaScript美食餐饮网站 3页面

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

【考研数据】四.2023年BJTU计算机学院考研录取数据分析(实时更新)

欢迎订阅本专栏:《北交计算机复试经验》 订阅地址:https://blog.csdn.net/m0_38068876/category_12110003.html 【考研数据】一.2020年BJTU计算机学院考研录取数据分析【考研数据】二.2021年BJTU计算机学院考研录取数据分析【考研数据】三.2022年BJTU计算机学院考研录取数据分…

苹果传数据到苹果手机?iPhone怎么数据传输

苹果传数据到苹果手机&#xff1f;很多朋友在换新iPhone的时候都很焦愁&#xff0c;旧手机里面的数据太多&#xff0c;去苹果店让工作人员帮忙迁移&#xff0c;估计要花费很多时间等待&#xff0c;而且没手机的那段时间特别难熬&#xff1b;自己动手弄&#xff0c;不知道简单的…

优秀程序员评判标准“高并发”,竟被一份Github万星笔记讲清楚了

处处需要高并发 ​“为什么Java面试必问高并发&#xff1f;” 这个问题已经让程序员们倍感头疼&#xff0c;尤其是想要跳槽到更大公司的程序员&#xff0c;能否漂亮的回答高并发的问题已经成为求职者是否是一个优秀程序员的评判标准&#xff0c;大厂面试尤为明显。 不得不说&a…

JAVA中数值类型转换

文章目录1 问题引入2 查看问题3 注意事项1 问题引入 经常需要将一种数值类型转换为另一种数值类型&#xff1b; 例如13.72—>整型浮点型。结果为4.72没问题&#xff0c;可是会有一些精度的问题。 2 查看问题 请看以下代码&#xff1a; int n 987654321;float f n;此时…

java计算机毕业设计ssm学生谈话管理系统2j3ws(附源码、数据库)

java计算机毕业设计ssm学生谈话管理系统2j3ws&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

第十四届蓝桥杯集训——JavaC组——运算符练习题

第十四届蓝桥杯集训——JavaC组——运算符练习题 为了能让大家更好的掌握四则运算、取模运算、关系运算以及逻辑计算&#xff0c;当然还有必不可少的三元运算符&#xff0c;这里准备了几个小题&#xff0c;好好练习一下一定能掌握的不错。 所有的小题都有对照的答案&#xff0…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java红旗家具城管理系统29a0m

做毕业设计一定要选好题目。毕设想简单&#xff0c;其实很简单。这里给几点建议&#xff1a; 1&#xff1a;首先&#xff0c;学会收集整理&#xff0c;年年专业都一样&#xff0c;岁岁毕业人不同。很多人在做毕业设计的时候&#xff0c;都犯了一个错误&#xff0c;那就是不借鉴…

电力预测|基于新型MDPSO-SVR混合模型的电力预测特征选择(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

中国能源统计数据1986-2020和省级能源结构(含计算步骤)

1、数据来源&#xff1a;中国能源统计数据 2、时间跨度&#xff1a;中国能源统计数据1986-2020年 、2003-2018年省级能源结构 3、区域范围&#xff1a;全国 4、指标说明&#xff1a; 中国能源统计数据版本说明 Excel&#xff1a;2020、2019、2018、2017、2016、2015、2014…

【我的C/C++语言学习进阶之旅】C++编程常出现错误:Undefined Reference的一些常见情况分析

本教程详细介绍了程序员在 C 中经常遇到的严重错误&#xff0c;如&#xff1a; Undefined referenceSegmentation fault (core dumped)Unresolved external symbol 我们将讨论我们在C 中经常遇到的最重要的错误确实至关重要。除了不时发生的系统以及语义错误和异常外&#xf…

2023最新版网络安全图成长路线图,从零基础到精通

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

这8个实用office技巧,让你的工作效率快人一步,建议收藏保存

大家平常使用office的时候&#xff0c;有没有发现一些小技巧呢&#xff1f;我整理了8个office技巧分享给大家&#xff0c;总有一个你能用得到&#xff0c;对提高我们的工作效率很有帮助哒。技巧一&#xff1a;合并多个Word文件如果大家需要在收集资料的时候&#xff0c;需要将多…

双功能螯合剂:2374782-03-1,NOTA-FAPI-04 ,NOTA-FAPI-4

NOTA-FAPI-04&#xff0c;NTFAPI-04&#xff0c;NOTA-FAPI-4 产品规格&#xff1a; 1.CAS号&#xff1a;2374782-03-1 2.分子式&#xff1a;C36H47F2N9O8 3.分子量&#xff1a;771.8238 4.包装规格&#xff1a;1g&#xff0c;5g&#xff0c;10g&#xff0c;包装灵活&#xf…

双向链表与DFS的Unix文件储存程序

title: 双向链表与DFS的Unix文件储存程序 date: 2021-11-28 12:39:26 tags: [链表][DFS] categories:[码农日常] 写在前面 这是一篇关于python编写的小型文件储存程序&#xff0c;旨在于模拟Unix下ls、cd等的命令&#xff0c;在整一个中文互联网世界中&#xff0c;很难找到这样…

华为云服务-运维篇-应用健康状况追踪-性能监测

文章目录前言性能监测意义应用性能监控Java 应用探针步骤一、登录虚拟机步骤二 、Java应用启动添加配置项步骤三、 APM步骤四、应用性能管理 APM步骤五、查看监控的应用性能管理相关的指标总结前言 之前的文章我们已经介绍过了华为云平台下 微服务日常如何运维。 这次我们介绍…