ArrayList模拟实现

news2024/12/28 19:50:12

ArrayList模拟实现

  • ArrayList 的初步介绍
    • 常见操作
  • ArrayList 的简单模拟实现

ArrayList 的初步介绍

ArrayList也叫做顺序表,底层是一个数组。

在这里插入图片描述
在创建顺序表 时就应该规定 里面元素的数据类型,其中不能直接传基本数据类型,例如int、char。需要传他们的包装类。


常见操作

插入元素需要调用add方法,java也提供了下列的add方法。
在这里插入图片描述


在这里插入图片描述

对于这种 add 方法,默认是尾插,所以打印结果为1 2 3 4.
在这里插入图片描述

还有一种 add 方法是 在指定下标插入一个元素。

在这里插入图片描述
下标为1的值是2的那个位置,所以最终会打印 1 5 2 3 4
在这里插入图片描述

想要删除元素需要调用 remove函数。
在这里插入图片描述
可以指定值删除,也可以指定下标删除。

ArrayList的其他操作可以看帮助手册或者看源码。

ArrayList 的简单模拟实现

在这里插入图片描述

成员变量需要有一个数组和 一个size ,这个size代表数组当中有效数据的个数。

在这里插入图片描述

构造方法中含有对数组的初始化。


add方法:
在这里插入图片描述

每次add都需要检查一下数组是否满了,如果满了,则需要扩容

在这里插入图片描述

在指定下标插入一个元素的add方法:

在这里插入图片描述

contains 方法:(查询一个值是否在顺序表当中存在)
在这里插入图片描述
getIndex方法:(查询一个值在顺序表当中对应的下标,如果找不到则返回-1)
在这里插入图片描述

remove 方法:(删除第一次出现的data)
在这里插入图片描述
EmptyException异常:
在这里插入图片描述

检查是否顺序表为空:
在这里插入图片描述

获取对应下标元素的值:

在这里插入图片描述
其余方法:
在这里插入图片描述
在这里插入图片描述

package test;

import java.util.Arrays;
import java.util.StringJoiner;

public class MyArraylist {
    private int[] elem;
    private int size;

    private static final int DEFAULT_SIZE = 10;

    public MyArraylist() {
        elem = new int[DEFAULT_SIZE];
    }

    public void add(int data) {
        checkCapacity();
        elem[size++] = data;
    }

    public void add(int index, int data) {
        checkCapacity();
        try {
            if (index == size) {
                add(data);
                return;
            }
            checkIndex(index);
            for (int i = this.size; i > index; i--) {
                elem[i] = elem[i - 1];
            }
            elem[index] = data;
            size++;
        } catch (PosIllegalException e) {
            e.printStackTrace();
        }

    }

    public boolean contains(int toFind) {
        int index = getIndex(toFind);
        return index != -1;
    }


    public int getIndex(int toFind) {
        for (int i = 0; i < this.size; i++) {
            if (elem[i] == toFind) {
                return i;
            }
        }
        return -1;
    }

    //删除第一次出现的data
    public void remove(int data) {
        try
        {
            checkEmpty();
            for (int i = 0; i < this.size; i++) {
                if (elem[i] == data) {
                    for (int j = i; j < size - 1; j++) {
                        elem[j] = elem[j + 1];
                    }
                    size--;
                    break;
                }
            }
        } catch (EmptyException e) {
            e.printStackTrace();
        }
    }

    private void checkEmpty() {
        if (isEmpty()) {
            throw new EmptyException("顺序表为空");
        }
    }
    public int get(int index) {
        try {
            checkIndex(index);
            return elem[index];
        } catch (PosIllegalException e) {
            e.printStackTrace();
        }
        return -1;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public int size() {
        return size;
    }

    public void clear() {
        size = 0;
    }

    public void set(int pos, int val) {
        try {
            checkIndex(pos);
            elem[pos] = val;
        } catch (PosIllegalException e) {
            e.printStackTrace();
        }

    }

    private void checkIndex(int index) throws PosIllegalException{
        if (!(index >= 0 && index < size)) {
            throw new PosIllegalException("pos位置不合法");
        }
    }


    private void checkCapacity() {
        if (this.size != elem.length) {
            return;
        }
        elem = Arrays.copyOf(elem, elem.length * 2);
    }

    public String toString() {
        StringJoiner sj = new StringJoiner(", ", "[", "]");
        for (int i = 0; i < this.size; i++) {
            sj.add(elem[i] + "");
        }
        return sj.toString();
    }
}





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

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

相关文章

超简易高效的 AI绘图工具—与sd-webui一致界面,6G显存最高提升75%出图速率!(附安装包)

大家好&#xff0c;我是灵魂画师向阳 今天给大家分享一个基于Stable Diffusion WebUI 构建的AI绘图工具—sd-webui-forge&#xff0c;该工具的目标在于简化插件开发&#xff0c;优化资源管理&#xff0c;加速推理。 Forge承诺永远不会对Stable Diffusion WebUI用户界面添加不…

链接追踪系列-09.spring cloud项目整合elk显示业务日志

准备工作&#xff1a; 参看本系列之前篇&#xff1a;服务器安装elastic search 本机docker启动的kibana-tencent 使用本机安装的logstash。。。 本微服务实现的logstash配置如下&#xff1a; 使用腾讯云redis 启动本机mysql 启动本机docker 启动nacos,微服务依赖它作为…

rollup打包工具

rollup打包工具 在学习vite和vue3源码的时候&#xff0c;接触到了rollup&#xff0c;所以过来学习一下 什么是rollup rollup是一个模块化的打包工具&#xff0c;会将javascript文件进行合并。比起webpack&#xff0c;webpack在打包的时候会进行代码注入(保障兼容性)&#xf…

fortran简单排序算法,对一维、二维矩阵进行正序或倒序排序

fortran简单排序算法&#xff0c;对一维、二维矩阵进行正序或倒序排序 0. 引言1. 算法实现1.1 一维数组排序1.2 二维数组排序1.2 module文件 2. 结语 0. 引言 排序算法是计算机科学中的一项重要技术&#xff0c;它将一组数据按照特定的顺序排列起来。排序算法有很多种&#xff…

【云原生】Prometheus整合Alertmanager告警规则使用详解

目录 一、前言 二、Altermanager概述 2.1 什么是Altermanager 2.2 Altermanager使用场景 三、Altermanager架构与原理 3.1 Altermanager使用步骤 3.2 Altermanager工作机制 3.3 Altermanager在Prometheus中的位置 四、Altermanager部署与接入Prometheus 4.1 Altermana…

Codeforces Round 797 (Div. 3) F. Shifting String

感觉这种题写多了&#xff0c;第一眼就感觉是个图论&#xff0c;很经典的排列置换问题&#xff0c;首先连边&#xff0c;然后观察样例可以知道&#xff0c;大概是多个环的大小取lcm&#xff0c;但容易发现&#xff0c;环内部的循环节也对答案有影响&#xff0c;比如一个长度为4…

threadx 线程以及优先级调整案例

以正点原子stm32 f407板子为例子&#xff0c;如何创建工程 CubeMXCubeIDE在我之前的文章里提到了&#xff0c;这里我就不多重复。 有关线程优先级的两个参数 priority和preemption&#xff0c;我们来看看在官网是如何定义的 在main.c里面添加一个printf转串口的代码&#xff0…

Binder解析精炼

Binder原理解析精炼 1 注册服务 Server进程向binder驱动向Binder驱动发起服务注册请求 向Binder驱动申请创建一个XXXService的Binder的实体&#xff0c;Binder驱动为这个XXXService创建位于内核中的Binder实体节点以及Binder的引用 Binder驱动将注册请求转发给ServiceManager进…

Manim学习笔记05:实现向量的加法动画

以同一点 O&#x1d442; 为起点的两个已知向量 →a&#x1d44e;→&#xff0c; →b&#x1d44f;→&#xff0c;以 OA&#x1d442;&#x1d434;&#xff0c;OB&#x1d442;&#x1d435; 为邻边作 □OACB◻&#x1d442;&#x1d434;&#x1d436;&#x1d435;&#xff…

Yolov8 姿态估计

原文:Yolov8 姿态估计 - 知乎 (zhihu.com) YOLOv8论文还没有,官方默默又加了新模型:姿态估计。 现在你可以用YOLOv8做目标检测、实例分割、图像分类、目标跟踪、姿态估计,未完待续。。。。。。 一、Yolov8姿态估计 Yolov8的姿态估计模型是在COCO数据集训练的,目前支持…

python+Selenium自动化之免登录(cookie及token)

目录 cookie免登录 通过接口获取cookie 启用浏览器绕过登录 添加token 使用登录可以减去每次登录的重复操作&#xff0c;直接操作系统登录后的菜单页面&#xff0c;也可以减少安全验证登录&#xff0c;如图像验证登录的操作。注意&#xff1a;cookie和token都有有效期。 c…

前端Vue组件化实践:打造自定义等宽tabs标签组件

在前端开发的世界里&#xff0c;随着业务复杂度的提升和需求的多样化&#xff0c;传统的整体式开发方式已经难以满足快速迭代和高效维护的需求。组件化开发作为一种重要的解决方案&#xff0c;正逐渐受到广大开发者的青睐。本文将结合Vue框架&#xff0c;探讨如何通过组件化开发…

如何在Linux上如何配置虚拟主机

在Linux上配置虚拟主机可以通过使用Apache HTTP服务器来实现。Apache是一个开源的跨平台的Web服务器软件&#xff0c;可以在多种操作系统上运行并支持虚拟主机的配置。 以下是在Linux上配置虚拟主机的步骤&#xff1a; 安装Apache HTTP服务器 在终端中运行以下命令来安装Apache…

CANoe:为什么两个VLAN接口不能设置同一个网络的IP地址呢?

经常玩CANoe的人应该配置过TCP/IP Stack中网络节点的网卡信息&#xff0c;基本的信息包含&#xff1a;MAC地址、IP地址、子网掩码、默认网关、MTU值、IPv6地址。 如果你想让发送出去的报文携带VLAN tag&#xff0c;可以在网卡上添加VLAN tag信息。 此时你就能得到两个新的网卡V…

加速数字化转型,信创自主可控:TapData 为银行业数据管理能力建设提供新思路

使用 TapData&#xff0c;化繁为简&#xff0c;摆脱手动搭建、维护数据管道的诸多烦扰&#xff0c;轻量代替 OGG、DSG 等同步工具&#xff0c;「CDC 流处理 数据集成」组合拳&#xff0c;加速仓内数据流转&#xff0c;帮助企业将真正具有业务价值的数据作用到实处&#xff0c;…

防火墙nat与智能选路

这里写目录标题 此实验是基于上个实验的基础上添加功能拓扑1办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换)首先在fw1防火墙创建电信和移动两个安全区域&#xff0c;并且将对应的接口划分进去配置nat测试 分公司设备可…

Java核心篇之JVM探秘:内存模型与管理初探

系列文章目录 第一章 Java核心篇之JVM探秘&#xff1a;内存模型与管理初探 第二章 Java核心篇之JVM探秘&#xff1a;对象创建与内存分配机制 第三章 Java核心篇之JVM探秘&#xff1a;垃圾回收算法与垃圾收集器 第四章 Java核心篇之JVM调优实战&#xff1a;Arthas工具使用及…

[web]-sql注入-白云搜索引擎

ctrlu查看源代码&#xff0c;发现前端有js过滤 <script>function myFunction(){var xdocument.getElementById("number").value;var adocument.getElementById("word").value;var ba.replace(/[\ |\~|\|\!|\|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\|\…

linux之find指令基础

目录 前言一、find .二、find xxx -name "*.c"三、组合查找文件名四、find . -type f五、find . -maxdepth 2 -type f六、find . -type f -perm 777七、find . -type f -name "*.txt" ! -perm 777八、借助-exec命令参考链接 前言 testfind下 check1.c ch…

【HTML入门】第十二课 - iframe框架

在早期没有出现Vue和React之前呢&#xff0c;做管理系统&#xff0c;iframe是非常普遍的技术。比如管理系统左侧有非常多的菜单&#xff0c;然后点击菜单后&#xff0c;右边就要展现不同的页面。 又或者呢&#xff0c;我们看一些网站&#xff0c;他们侧边展示着五彩绚烂的广告&…