手写ArrrayList

需求

在这里插入图片描述

自定义的MyArrayList

import java.util.Arrays;
import java.util.Objects;

public class MyArrayList<E> {
    private Object[] elementData ; // 存储元素的数组
    private int size; // 记录 的元素个数
    private static final int DEFAULT_CAPACITY = 10; // 默认容量


    // 添加元素
    public boolean add(E e) {
        // 1.判断是否需要扩容
        if (Objects.isNull(elementData) || size == elementData.length ) {
           grow();
        }
        // 2.添加元素
        elementData[size++] = e;
        return true;
    }

    // 获取元素
    public E get(int index) {
        // 判断index是否合法
        checkIndex(index);
        return (E) elementData[index];
    }

    // 删除元素
    public E remove(int index) {
        // 1.判断index是否合法
        checkIndex(index);
        // 2.获取要删除的元素
        E oldValue = (E) elementData[index];
        // 3.计算要移动的元素个数
        int moveSize = size - index - 1;
        // 4.移动元素
        if (moveSize > 0) {
            // 从index+1开始移动 moveSize个元素到index位置
            System.arraycopy(elementData,index + 1,elementData,index,moveSize);
        }
        // 5.将最后一个元素置为null
        elementData[--size] = null;
        return oldValue;
    }

    // 遍历
    public void forEach(MyConsumer<E> action) {
        Objects.requireNonNull(action);
        for (int i = 0; i < size; i++) {
            action.accept((E) elementData[i]);
        }
    }

    // 扩容
    private void grow() {
      //   1.判断原来的容量是不是为0 如果为0 则新建一个长度为10的数组
      if (size == 0){
          elementData = new Object[DEFAULT_CAPACITY];
      } else {
          // 1.5倍扩容复制原来的数组到新数组
          elementData =  Arrays.copyOf(elementData,size + (size >> 1));
      }
    }



    // 判断index是否合法
    private void checkIndex(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("索引不合法");
        }
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; i < size; i++) {
            sb.append(elementData[i]);
            if (i < size - 1) {
                sb.append(",");
            }
        }
        sb.append("]");
        sb.append("size = ").append(size);
        sb.append(" capacity = ").append(elementData.length);
        return sb.toString();
    }
}

自定义函数式接口(供forEach使用)

@FunctionalInterface
public interface MyConsumer<E> {
   void accept(E e);
}

测试

// 测试添加元素
MyArrayList<String> list = new MyArrayList<>();
list.add("张无忌");
list.add("赵敏");
list.add("周芷若");
list.add("小昭");
list.add("殷素素");
list.add("张三丰");
list.add("张翠山");
list.add("张无忌");
list.add("赵敏");
list.add("周芷若");
list.add("小昭");
System.out.println("list = " + list);


// 测试获取元素
list.remove(0);
list.remove(99);
System.out.println("list = " + list);

// 测试遍历
list.forEach(System.out::println);

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

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

相关文章

Java高频面试之JVM篇

说一下 Jvm 的主要组成部分&#xff1f;及其作用&#xff1f; 类加载器执行器运行时数据区域本地接口 谈谈对运行时数据区的理解&#xff1f; 堆和栈的区别是什么&#xff1f; 堆中存什么&#xff1f;栈中存什么&#xff1f; 堆总存对象,栈中存局部变量,引用 为什么要把堆…

最新php投票系统源码下载 二维码投票生成器系统 源码开源可二开

在当今数字化时代&#xff0c;投票系统已成为各类活动、选举、调查等场景中不可或缺的工具。为了满足广大用户对于高效、便捷投票系统的需求&#xff0c;分享一款最新版的PHP投票系统源码&#xff0c;带二维码投票生成器功能&#xff0c;为用户提供了更为灵活和多样化的投票体验…

说说你对栈、队列的理解?应用场景?

一、栈 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性表&#xff0c;限定仅在表尾进行插入和删除操作的线性表 表尾这一端被称为栈顶&#xff0c;相反地另一端被称为栈底&#xff0c;向栈顶插入元素被称为进栈、入栈、压栈&#xff0c;从栈顶删…

【Python实践应用】使用Python加载栅格数据

下面的代码实现的是加载伊宁市NDVI数据&#xff0c;首先进行相关的python包的导入&#xff0c;然后定义和读取我们需要加载的数据&#xff0c;这里我们使用的NDVI数据是将伊宁23年的NDVI数据合并成为了一张栅格图像&#xff0c;每个波段表示一年的 NDVI&#xff0c;我们这里显示…

备战蓝桥杯---刷杂题2

显然我们直接看前一半&#xff0c;然后我们按照斜行看&#xff0c;我们发现斜行是递增的&#xff0c;而同一行从左向右也是递增的&#xff0c;因此我们可以直接二分&#xff0c;同时我们发现对称轴的数为Ck,2k. 我们从16斜行枚举即可 #include<bits/stdc.h> using name…

探索AI工具导航网站

在现代科技发展迅猛的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为了各行各业中不可或缺的一部分。了解和利用最新的AI工具对于工作、学习和娱乐都具有重大意义。在这篇博客中&#xff0c;我们将探索一些最新的人工智能工具导航网站&#xff0c;以及其中一款名…

liunx系统发布.net core项目

liunx系统发布.net core项目 准备.net6程序运行环境部署nginx&#xff0c;通过一个地址既能访问web api&#xff0c;又能访问web项目有一个客户把web api放到docker中&#xff0c;想通过nginx转发&#xff0c;nginx也支持配置多个程序api接口的其它 liunx系统&#xff1a;cento…

【vue】ref 和 reactive 对比

ref&#xff1a;存储单个数据&#xff0c;如数值&#xff0c;字符串reactive&#xff1a;存储复杂数据&#xff0c;如对象&#xff0c;数组 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"vie…

短剧小程序系统开发,让短剧观看与创作更加便捷。短剧系统源码搭建

一、目前短剧发展趋势 1. 市场规模&#xff1a;根据数据来看&#xff0c;2023年中国微短剧市场规模达到了373.9亿元&#xff0c;同比上升了267.65%。预计2024年市场规模将超过500亿元。这一市场规模的增长速度非常显著&#xff0c;显示出短剧行业的巨大潜力和发展前景。 2. 投…

3款热门婴儿洗衣机全面对比测评:希亦、小吉、觉飞哪款性能最强?

经常洗大人衣物的传统洗衣机&#xff0c;很少有专门的高温除菌等功能&#xff0c;所以洗衣机里有可能会有一些大人身上带有的细菌&#xff0c;特别是婴儿衣物&#xff0c;婴儿抵抗能力弱&#xff0c;衣物混洗可能让宝宝感染细菌而导致生病&#xff0c;这种事情是有过发生的&…

SI案例分享--实用的单端口Delta-L测试方法

目录 0 引言 1 单端口Delta-L技术 2 基于单端口Delta-L方法的反射灵敏度分析 3 用充分表征的材料系统验证该方法 4 在单端口法中提取总损耗 5 总结 0 引言 Intel Delta-L方法已被公认为一种常规方法&#xff0c;通过对测试线进行2端口测量来提取层压板材料的Dk和插入损耗…

FX110网:汇市经纪商Prospero Markets被ASIC发出正式清盘令

澳大利亚联邦法院已批准金融监管机构 ASIC 的请求&#xff0c;向ASIC 许可的&#xff08;前&#xff09;零售外汇和差价合约经纪商 Prospero Markets Pty Ltd 发出正式清盘令。 相关阅读&#xff1a;《ASIC请求下令清盘汇市经纪商Prospero Markets》 法院于周四发布命令&#…

JVM调优工具详解-jps、jmap、jstat、jstack

jps 用于查看相关java线程的相关信息 选项作用-q仅显示进程 ID&#xff0c;而不显示类名或 JAR 文件的路径-m显示传递给主类的参数-l显示完整的主类名或 JAR 文件的路径-v显示传递给 Java 虚拟机的参数 jmap 此命令用来查看内存信息&#xff0c;实例个数以及占内存大小 jmap…

Ant Design 表单基础用法综合示例

Ant Design 的表单组件设计得非常出色,极大地简化了表单开发的复杂度,让开发者能够快速构建出功能丰富、交互友好的表单界面。 接下来总结一下 Ant Design 中表单的基本用法。 Form 组件 用于定义整个表单,可以设置表单的布局方式、提交行为等。通常会将表单字段组件嵌套在 F…

从ChatGPT到多模态大模型:现状与未来(多模态)

ChatGPT 训练的核心技术主要包括: 预训练语言模型;有监督微调;基于人类反馈的 强 化 学 习 (ReinforcementLearningfrom Human Feedback,RLHF) 首先,通过自监督预训练使语言模型从大规模语料库中学习语言规律,具备基础 理解和生成能力;然后,通过构造指令微调数据集 并对模型进…

VMware导出虚拟机vmkd格式转换qcow2

VMware虚拟机导出qcow2格式可以上传至云服务 1、需要导出的虚拟机 2、克隆虚拟机 3、选择克隆源 4、创建完整克隆 5、完成 6、找到VMware安装路径 7、找到vmware-vdiskmanager所在路径使用cmd或Windows PowerShell进入目录 进入vmware-vdiskmanager目录 cd F:\软件\VMware Wo…

CSS特效---百分比加载特效

1、演示 2、一切尽在代码中 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title&…

【NLP】多标签分类【下】

文章目录 简介个人博客与相关链接1 实验数据与任务说明2 模型介绍2.1 TransformerTransformer能做什么&#xff1f; 2.2 Hugging FaceHugging Face的Transformers库社区支持和资源预训练模型的应用 2.3 T5模型&#xff08;Text-To-Text Transfer Transformer&#xff09;T5的核…

VUE3组合式API

create-vue create-vue是Vue官方新的脚手架工具&#xff0c;底层切换到了vite,为开发提供极速相应 使用create-vue 1.安装16.0或者更高版本的Node.js 2.npm init vuelatest指令会安装并执行create-vue 项目目录和关键文件 组合式API Vue 3引入了组合式API&#xff08;Com…

走进MySQL:从认识到入门(针对初学者)

一&#xff0c;引言 MySQL是一款久负盛名且广泛应用的关系型数据库管理系统&#xff0c;自1995年Michael Widenius和David Axmark在瑞典和芬兰发起研发以来&#xff0c;其发展历程可谓辉煌且深远。作为开源软件的代表&#xff0c;MySQL以其卓越的成本效益、高性能及高可靠性赢得…