ArrayList模拟实现

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





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

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

相关文章

VS编译和使用modbus库

一.libmodbus 库 免费的开源的&#xff0c;modbus 开发库&#xff0c;支持 RTU 和 TCP 官网&#xff1a;libmodbus.org 在线文档&#xff1a;https://libmodbus.org/reference/ 二.源码简介 项目说明doc 目录各 API 接口的详细说明文档src 目录源码都在这个目录下tests 目录…

06 人以群分 基于邻域的协同过滤算法

这一讲我们将正式进入算法内容的学习。 推荐算法本质 推荐算法本质上是一一种信息处理方法&#xff0c;它将用户信息和物品信息处理后&#xff0c;最终输出了推荐结果。因为 05 讲中基于热门推荐、基于内容推荐、基于关联规则推荐等方法比较粗放&#xff0c;所以推荐结果往往…

C语言 | Leetcode C语言题解之第231题2的幂

题目&#xff1a; 题解&#xff1a; const int BIG 1 << 30;bool isPowerOfTwo(int n) {return n > 0 && BIG % n 0; }

Study--Oracle-07-ASM自动存储管理(二)

一、ASM安装准备条件 1、ASM支持存储类型 本地祼设备&#xff08;本地的磁盘和分区&#xff09; 网络附加存储(NAS) 存储区域网络(SAN) 2、ASM使用本地裸设备&#xff0c;要点: 已经被挂载到操作系统上或者已经做了分区 映射裸设备为文件名 设置正确的权限&#xff08;针对g…

C++继承和多态

目录 继承 继承的意义 访问限定符、继承方式 赋值兼容规则&#xff08;切片&#xff09; 子类的默认成员函数 多继承 继承is a和组合has a 多态 什么是多态 形成多态的条件 函数重载&#xff0c;隐藏&#xff0c;重写的区别 override和final 多态原理 继承 继承的…

矩阵管理系统实现后台统一管理的解决方案

在当今数字化浪潮中&#xff0c;企业面临着前所未有的挑战与机遇。如何快速响应市场变化、提升运营效率、降低管理成本&#xff0c;成为众多企业关注的焦点。而矩阵管理系统作为一种新兴的管理工具&#xff0c;凭借其强大的后台统一管理能力&#xff0c;正成为越来越多企业的首…

【Redis】复制(Replica)

文章目录 一、复制是什么&#xff1f;二、 基本命令三、 配置&#xff08;分为配置文件和命令配置&#xff09;3.1 配置文件3.2 命令配置3.3 嵌套连接3.4 关闭从属关系 四、 复制原理五、 缺点 以下是本篇文章正文内容 一、复制是什么&#xff1f; 主从复制 master&#xff…

基于javaScript的冒泡排序

目录 一.前言 二.设计思路和原理 三.源代码展示 四. 案例运行结果 一.前言 冒泡排序简而言之&#xff0c;就是一种算法&#xff0c;能够把一系列的数据按照一定的顺序进行排列显示&#xff08;从小到大或从大到小&#xff09;。例如能够将数组[5,4,3,2,1]中的元素按照从小到…

使用数字孪生实现电池管理系统 (BMS) 测试自动化

电池管理系统 (BMS) 监控和控制电动飞机和电动汽车等车辆中的电池。它需要在正常和极端条件下进行严格测试&#xff0c;以证明其质量和完整性。 使用模拟电池进行测试非常有益&#xff0c;因为可以快速、反复地安全地测试各种条件&#xff0c;而不会冒着宝贵硬件的风险。这种硬…

Hash表(C++)

本篇将会开始介绍有关于 unordered_map 和 unordered_set 的底层原理&#xff0c;其中底层实现其实就是我们的 Hash 表&#xff0c;本篇将会讲解两种 Hash 表&#xff0c;其中一种为开放定址法&#xff0c;另一种为 hash 桶&#xff0c;在unordered_map 和 unordered_set 的底层…

6、evil box one

低—>中 目标&#xff1a;获取root权限以及2个flag 主机发现 靶机 192.168.1100.40 或者使用fping -gaq 192.168.100.1/24发现主机使用ping的方式。 端口扫描 发现开放了22和80 可以使用-A参数&#xff0c;-A参数会得到更多的扫描细节 访问80端口就是一个apache的基本的…

Redis 7.x 系列【23】哨兵模式

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 工作原理2.1 监控2.2 标记下线2.3 哨兵领袖2.4 新的主节点2.5 通知更新 3. …

JMeter案例分享:通过数据验证的错误,说说CSV数据文件设置中的线程共享模式

前言 用过JMeter参数化的小伙伴&#xff0c;想必对CSV Data Set Config非常熟悉。大家平时更关注变量名称&#xff0c;是否忽略首行等参数&#xff0c;其余的一般都使用默认值。然而我最近遇到一个未按照我的预想读取数据的案例&#xff0c;原因就出在最后一个参数“线程共享模…

服务重启时容器未自动启动

1、容器重启策略 通过设置容器的重启策略&#xff0c;‌可以决定在容器退出时Docker守护进程是否重启该容器。‌常见的重启策略包括&#xff1a;‌ no&#xff1a;‌不重启容器&#xff0c;‌默认策略。‌always&#xff1a;‌无论容器是如何退出的&#xff0c;‌总是重启容器…

keil配置irom偏移地址进行IAP,偏移地址不生效问题解决

如果keil配置了 IROM1 偏移地址&#xff0c;但是生成的hex&#xff0c;程序并没有偏移&#xff0c;问题多半是出现在linker里如下图所示。选择了分散加载&#xff0c;所以keil配置地址偏移不生效。 点开edit 更改分散加载的地址偏移即可。 偏移成功&#xff0c;可以IAP了。

算法学习笔记(8.5)-零钱兑换问题二

目录 Question&#xff1a; 动态规划思路&#xff1a; 代码实现&#xff1a; 空间优化代码 Question&#xff1a; 给定n种硬币&#xff0c;第i种硬币的面值为coins[i-1],目标金额为amt&#xff0c;每种硬币可以重复选取&#xff0c;问凑出目标金额的硬币组合数量。 动态规划思路…

Java 线程池详解

序言 在高并发编程中&#xff0c;线程池是一个非常重要的组件。它不仅能够有效地管理和复用线程资源&#xff0c;还可以提升应用程序的性能和稳定性。本文将详细介绍Java中的线程池机制&#xff0c;以及如何正确地使用线程池。 一、什么是线程池 线程池是一组已经初始化并等…

ftp pool 功能分析及 golang 实现

本文探究一种轻量级的 pool 实现 ftp 连接。 一、背景 简要介绍&#xff1a;业务中一般使用较多的是各种开源组件&#xff0c;设计有点重&#xff0c;因此本文探究一种轻量级的 pool 池的思想实现。 期望&#xff1a;设置连接池最大连接数为 N 时&#xff0c;批量执行 M 个 F…

超时导致SparkContext构造失败的问题探究

文章目录 1.前言2. 基于事故现场对问题进行分析2.1 日志分析2.2 单独测试Topology代码试图重现问题 3. 源码解析3.1 Client模式和Cluster模式下客户端的提交和启动过程客户端提交时在两种模式下的处理逻辑ApplicationMaster启动时在两种模式下的处理逻辑 3.2 两种模式下的下层角…

OSPF.综合实验

1、首先将各个网段基于172.16.0.0 16 进行划分 1.1、划分为4个大区域 172.16.0.0 18 172.16.64.0 18 172.16.128.0 18 172.16.192.0 18 四个网段 划分R4 划分area2 划分area3 划分area1 2、进行IP配置 如图使用配置指令进行配置 ip address x.x.x.x /x 并且将缺省路由…