Java数据结构-模拟ArrayList集合思想,手写底层源码(1),底层数据结构是数组,编写add添加方法,正序打印和倒叙打印
package com.atguigu.structure; public class Demo02_arrayList {public static void main(String[] args) {MyGenericArrayListV1 arrayListV1 = new MyGenericArrayListV1();//arr.add(element:100,index:1);下标越界,无法插入//初始化(第一次添加) elements=[0,0,0,0,0] size=0//第二次添加前 elements=[10,0,0,0,0] size=1//第三次添加前 elements=[10,20,0,0,0] size=2arrayListV1.add(10, 0);arrayListV1.add(20, 1);arrayListV1.add(30, 2);//打印前 elements=[10,20,30,0,0] size=3arrayListV1.print();//10 20 30 0 0//10 20 30 0 0 elements=[10,20,30,0,0] size=3//第四次添加前 elements=[10,20,30,0,0] size=3arrayListV1.add(40,0);//第五次添加前 elements=[40,10,20,30,0] size=4arrayListV1.add(50,0);//打印 elements=[50,40,10,20,30] size=5arrayListV1.print();//50 40 10 20 30//倒叙打印前 elements=[50,40,10,20,30] size=5arrayListV1.printRev();//30 20 10 40 50} } class MyGenericArrayListV1{//组织存储数据的结构private int[] elements;//数据关系的属性//The size of the ArrayList (the number of elements it contains)//这里说的元素的数量指的是ArrayList集合元素的数量,不是底层数组,底层数组只有长度//ArrayList集合的大小(包含元素的数量)private int size;public MyGenericArrayListV1() {this(5);}public MyGenericArrayListV1(int capacity) {elements = new int[capacity];size = 0;}//操作数据的方法://1、新增:根据下标插入数据、头插 、 尾插public void add(int element, int index) {//参数1:要新增的数据 参数2:要插入的位置下标//第一次添加 element=10 index=0 size=0//第二次添加 element=20 index=1 size=1//第三次添加 element=30 index=2 size=2//第四次添加 element=40 index=0 size=3//第五次添加 element=50 index=0 size=4if (isFull()) {System.out.println("数组已满,无法插入");return;}//数组数据是连续存储的,不能跳过未存储数据的位置//第一次添加 index=0 size=0 element=10 elements=[0,0,0,0,0]//第二次添加 index=1 size=1 element=20 elements=[10,0,0,0,0]//第三次添加 index=2 size=2 element=30 elements=[10,20,0,0,0]//第四次添加 index=0 size=3 element=40 elements=[10.20,30,0,0]//第五次添加 index=0 size=4 element=50 elements=[40,10,20,30,0]if (index<0||index>size) {System.out.println("下标越界,无法插入");return;}//如果新增时,数组中没有元素,添加到第一个索引位置 直接存入//如果位置上已存在元素 当前索引位置旧元素需要往后移动//[1,2,3,4,0] => 将 5 插入到索引为 index(1) 的位置 [1,5,2,3,4] ==>设置5到索引1位置//[1,2,3,0,0] => 将 5 插入到索引为 index(1) 的位置 [1,5,2,3,0] ==>设置5到索引1位置//判断要存入的位置是否需要移动元素//第一次添加 index=0 size=0 i=size-1=-1>0 -1>不大于0 所以循环进不去,不用移动元素//第二次添加 index=1 size=1 i=size-1=0>1 0不大于1 所以循环进不去,不用移动元素//第三次添加 index=2 size=2 i=size-1=1>2 1不大于2 所以循环进不去,不用移动元素//第四次添加 index=0 size=3 i=size-1=2>0 2大于0满足条件,进入循环,移动元素//第五次添加 index=0 size=4 i=size-1=3>0 3大于0满足条件,进入循环,移动元素for (int i = size - 1; i >= index; i--) {//第四次添加 i=2 elements=[10,20,30,0,0] elements=[10,20,30,30,0]// i=1 elements=[10,20,30,30,0] elements=[10,20,20,30,0]// i=0 elements=[10,20,20,30,0] elements=[10,10,20,30,0]//第五次添加 i=3 elements=[40,10,20,30,0] elements=[40,10,20,30,30]// i=2 elements=[40,10,20,30,30] elements=[40,10,20,20,30]// i=1 elements=[40,10,20,10,30] elements=[40,10,10,20,30]// i=0 elements=[40,10,10,20,30] elements=[40,40,10,20,30]elements[i + 1] = elements[i];}//第一次添加前 element=10 index=0 elements=[0,0,0,0,0]//第一次添加后 element=10 index=0 elements=[10,0,0,0,0]//第二次添加前 element=20 index=1 elements=[10,0,0,0,0]//第二次添加后 element=20 index=1 elements=[10,20,0,0,0]//第三次添加前 element=30 index=2 elements=[10,20,0,0,0]//第三次添加后 element=30 index=2 elements=[10,20,30,0,0]//第四次添加前 element=40 index=0 elements=[10,10,20,30,0]//第四次添加后 element=40 index=0 elements=[40,10,20,30,0]//第五次添加前 element=50 index=0 elements=[40,40,10,20,30]//第五次添加后 element=50 index=0 elements=[50,40,10,20,30]elements[index] = element;//第一次添加 size=0 变成 size=1 element=10 index=0//第二次添加 size=1 变成 size=2 element=20 index=1//第三次添加 size=2 变成 size=3 element=30 index=2//第四次添加 size=3 变成 size=4 element=40 index=0//第五次添加 size=4 变成 size=5 element=50 index=0size++;}//2、删除//3、修改//4、查询//辅助方法:新增数据时size++,移除数据时size--//是否为空public boolean isEmpty() {//第一次打印 size=3 此方法不成立 返回false//第二次打印 size=5 此方法不成立 返回false//倒叙打印 size=5 此方法不成立 返回falsereturn size == 0;}//是否已满public boolean isFull() {//第一次添加 elements=[0,0,0,0,0] size=0 elements.length=5//第二次添加 elements=[10,0,0,0,0] size=1 elements.length=5 //第三次添加 elements=[10,20,0,0,0] size=2 elements.length=5//第四次添加 elements=[10,20,30,0,0] size=3 elements.length=5//第五次添加 elements=[40,10,20,30,0] size=4 elements.length=5return size == this.elements.length;}//正序打印public void print() {//elements.length=5 elements=[10,20,30,0,0]if (isEmpty()) {return;}//第一次打印 elements=[10,20,30,0,0] elements.length=5//第二次打印 elements=[50,40,10,20,30] elements.length=5for (int i = 0; i < this.elements.length; i++) {//第一次循环 i=0 elements=[10,20,30,0,0] elements[i]=10 elements.length=5//第二次循环 i=1 elements=[10,20,30,0,0] elements[i]=20 elements.length=5//第三次循环 i=2 elements=[10,20,30,0,0] elements[i]=30 elements.length=5//第四次循环 i=3 elements=[10,20,30,0,0] elements[i]=0 elements.length=5//第五次循环 i=4 elements=[10,20,30,0,0] elements[i]=0 elements.length=5//第一次循环 i=0 elements=[50,40,10,20,30] elements[i]=50 elements.length=5//第二次循环 i=1 elements=[50,40,10,20,30] elements[i]=40 elements.length=5//第三次循环 i=2 elements=[50,40,10,20,30] elements[i]=10 elements.length=5//第四次循环 i=3 elements=[50,40,10,20,30] elements[i]=20 elements.length=5//第五次循环 i=4 elements=[50,40,10,20,30] elements[i]=30 elements.length=5System.out.print(this.elements[i] + "\t");}System.out.println();}//反序打印public void printRev() {//倒叙打印前 elements.length=5 elements=[50,40,10,20,30]//判断完 isEmpty的返回值是false 所以进不去if if (isEmpty()) {return;}//elements=[50,40,10,20,30] elements.length=5int length = this.elements.length;//length=5 while (--length >= 0) {//第一次使用数组长度-1,当做下标取最后一个位置的元素打印//第二次使用长度-2//length=4 elements=[50,40,10,20,30] elements[4]=30 elements.length=5//length=3 elements=[50,40,10,20,30] elements[3]=20 elements.length=5//length=2 elements=[50,40,10,20,30] elements[2]=10 elements.length=5//length=1 elements=[50,40,10,20,30] elements[1]=40 elements.length=5//length=0 elements=[50,40,10,20,30] elements[0]=50 elements.length=5System.out.println(this.elements[length]+"\t");}System.out.println();}}
相关文章:
Java数据结构-模拟ArrayList集合思想,手写底层源码(1),底层数据结构是数组,编写add添加方法,正序打印和倒叙打印
package com.atguigu.structure; public class Demo02_arrayList {public static void main(String[] args) {MyGenericArrayListV1 arrayListV1 new MyGenericArrayListV1();//arr.add(element:100,index:1);下标越界,无法插入//初始化(第一次添加&…...
MyBatis-Plus如何 关闭SQL日志打印
前段时间公司的同事都过来问我,hua哥公司的项目出问题了,关闭不了打印sql日记,项目用宝塔自己部署的,磁盘满了才发现大量的打印sql日记,他们百度过都按照网上的配置修改过不起作用,而且在调试时候也及为不方…...
单元测试框架jUnit
JUnit(Java单元测试框架)是用于在Java应用程序中执行单元测试的框架。它是一个开源框架,广泛用于Java开发中。以下是一些关于JUnit的常见问题以及相应的汉语回答: 1. **什么是JUnit?** - JUnit是一个用于编写和运行…...
微软 Visual Studio 迎来 AI 建议命名功能
目录 1微软 Visual Studio 迎来 AI 建议命名功能 2专访核桃编程CEO曾鹏轩:实操是掌握编程技能的唯一办法 1微软 Visual Studio 迎来 AI 建议命名功能 IT之家 12 月 19 日消息,使用付费 GitHub Copilot Chat 扩展的 Visual Studio Preview 用户…...
【排序算法】C语言实现选择排序与冒泡排序
文章目录 🚀前言🚀冒泡排序✈️冒泡排序的逻辑✈️冒泡排序coding 🚀选择排序✈️选择排序的逻辑✈️选择排序coding 🚀前言 这里是阿辉算法与数据结构专栏的第一篇文章,咱们就从排序算法开始讲起,排序算法…...
设计模式之-原型模式,快速掌握原型模式,通俗易懂的理解原型模式以及使用场景
文章目录 一、什么是原型模式二、使用场景三、代码示例 一、什么是原型模式 原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新的对象,而无需通过调用构造函数来创建。原型模式通过克隆操作来创建对象,提供了一种更加灵活和高效…...
数据结构之进阶二叉树(二叉搜索树和AVL树、红黑树的实现)超详细解析,附实操图和搜索二叉树的实现过程图
绪论 “生命有如铁砧,愈被敲打,愈能发出火花。——伽利略”;本章主要是数据结构 二叉树的进阶知识,若之前没学过二叉树建议看看这篇文章一篇掌握二叉树,本章的知识从浅到深的对搜索二叉树的使用进行了介绍和对其底层…...
SpringIOC之LocaleContext
博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…...
前端案例—antdDesign的Select多选框组件加上全选功能
前端案例—antdDesign的Select多选框组件加上全选功能。 实现效果如下: Select 组件里有这个属性,可以利用这个对下拉菜单进行自定义。 const handleChange (e, value) > {setSelectState(e.target.checked)let arr productOptions?productOption…...
个人财务工具、密钥管理平台、在线会计软件、稍后阅读方案 | 开源专题 No.51
gethomepage/homepage Stars: 10.1k License: GPL-3.0 这个项目是一个现代化、完全静态的、快速且安全的应用程序仪表盘,具有超过 100 种服务和多语言翻译的集成。 快速:网站在构建时以静态方式生成,加载时间飞快。安全:所有对后…...
HBase基础知识(二):HBase集群部署、HBaseShell操作
1. HBase安装部署 1.1 Zookeeper正常部署 首先保证Zookeeper集群的正常部署,并启动之: 创建集群启动脚本: #!/bin/bash case $1 in "start"){ for i in hadoop100 hadoop101 hadoop102 do echo----------zookeeper $i 启动----…...
C 标准库 - <time.h>
简介 time.h 头文件定义了四个变量类型、两个宏和各种操作日期和时间的函数。 库变量 下面是头文件 time.h 中定义的变量类型: 序号变量 & 描述1size_t是无符号整数类型,它是 sizeof 关键字的结果。2clock_t这是一个适合存储处理器时间的类型。3…...
养老院自助饮水机(字符设备驱动)
目录 1、项目背景 2、驱动程序 2.1 三层架构 2.2 驱动三要素 2.3 字符设备驱动 2.3.1 驱动模块 2.3.2 应用层 3、设计实现 3.1 项目设计 3.2 项目实现 3.2.1 驱动模块代码 3.2.2 用户层代码 4、功能特性 5、技术分析 6. 总结与未来展望 1、项目背景 养老院的老人…...
Jenkins 构建触发器指南
目录 触发远程构建 (例如,使用脚本) 描述 配置步骤 安全令牌 在其他项目构建完成后触发构建 描述 配置步骤 定时触发构建 描述 配置步骤 GitHub钩子触发GITScm轮询 描述 配置步骤 Poll SCM - 轮询版本控制系统 描述 触发远程构建 (例如,使…...
通用的java中部分方式实现List<自定义对象>转为List<Map>
自定义类 /*** date 2023/12/19 11:20*/ public class Person {private String name;private String sex;public Person() {}public Person(String name, String sex) {this.name name;this.sex sex;}public String getName() {return name;}public String getSex() {return…...
Python---静态Web服务器-返回固定页面数据
1. 开发自己的静态Web服务器 实现步骤: 编写一个TCP服务端程序获取浏览器发送的http请求报文数据读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器。HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字。 2. 静态Web服务器-返回固…...
react v-18父组件调用子组件的方法和数据
版本 "react": "^18.1.0", "react-dom": "^18.1.0", 父组件 import React, { useState, useRef, memo, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { Card } from &q…...
Linux——缓冲区
我在上篇博客留下了一个问题,那个问题就是关于缓冲区的问题,我们发现 文件有缓冲区,语言有用户级缓冲区,那么缓冲区到底是什么?,或者该怎 么认识缓冲区?这篇文章或许会让你有所认识,…...
Mac 生成Android签名证书 .keystore文件
工具下载地址 https://www.oracle.com/java/technologies/downloads/#jdk21-mac1. 找到安装jdk的路径,并进入bin目录下 1.1 查找JDK命令 /usr/libexec/java_home -v结果为: java_home: option requires an argument -- v /Library/Java/JavaVirtualMachines/jdk…...
电商数仓项目----笔记六(数仓ODS层)
ODS层的设计要点如下: (1)ODS层的表结构设计依托于从业务系统同步过来的数据结构。 (2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比较高的,此处选择gzip。 (3)…...
提升90% UI开发效率:psd2fgui工具从设计到实现的全流程指南
提升90% UI开发效率:psd2fgui工具从设计到实现的全流程指南 【免费下载链接】psd2fgui A tool for converting psd file to fairygui package. 项目地址: https://gitcode.com/gh_mirrors/ps/psd2fgui 一、核心价值:为什么选择psd2fgui࿱…...
嵌入式开发问题解决:从复现到根治的实战指南
1. 嵌入式开发问题解决之道:从复现到根治 搞嵌入式开发这些年,踩过的坑比写过的代码还多。每次遇到系统崩溃、数据异常或者外设抽风,都像在玩侦探游戏——证据支离破碎,真凶隐藏极深。今天就把我这些年总结的"破案"方法…...
如何优化A-to-Z-Resources-for-Students文档的行距与段距:提升阅读体验的完整指南
如何优化A-to-Z-Resources-for-Students文档的行距与段距:提升阅读体验的完整指南 【免费下载链接】A-to-Z-Resources-for-Students ✅ Curated list of resources for college students 项目地址: https://gitcode.com/GitHub_Trending/at/A-to-Z-Resources-for…...
别再让LVGL卡顿了!手把手教你用思澈SDK的menuconfig优化framebuffer配置,帧率翻倍
别再让LVGL卡顿了!手把手教你用思澈SDK的menuconfig优化framebuffer配置,帧率翻倍 嵌入式UI开发中,LVGL的流畅度直接影响用户体验。许多开发者在使用思澈SDK时,常遇到界面卡顿、帧率低的问题。本文将深入分析framebuffer配置对性能…...
腾讯混元翻译模型惊艳效果:HY-MT1.5真实翻译案例分享
腾讯混元翻译模型惊艳效果:HY-MT1.5真实翻译案例分享 1. 模型概述:轻量级多语言翻译新标杆 腾讯开源的HY-MT1.5翻译模型系列近期在技术社区引发广泛关注,特别是其中的1.8B参数版本(HY-MT1.5-1.8B)凭借出色的性价比表…...
SAP BTP新手避坑指南:从零开始创建Directory和Subaccount(附Region选择建议)
SAP BTP新手避坑指南:从零开始创建Directory和Subaccount(附Region选择建议) 第一次登录SAP BTP Cockpit时,面对Global Account、Directory、Subaccount的层级关系,很多新手会感到无从下手。这就像刚拿到一套乐高积木却…...
Arduino库管理终极指南:在VS Code中如何优雅添加自定义头文件(避坑版)
Arduino库管理终极指南:在VS Code中优雅添加自定义头文件 第一次在VS Code里看到"fatal error: my_library.h: No such file or directory"的红色报错时,我盯着屏幕发了五分钟呆。作为从Arduino IDE转战VS Code的老玩家,本以为能无…...
保姆级教程:用STM32CubeMX配置TIM1的PA8和PA11输出PWM波(STM32F103C8T6)
STM32CubeMX实战:从零配置TIM1的PA8/PA11输出PWM驱动电机 当你第一次拿到STM32F103C8T6这块蓝色的小板子时,可能会被密密麻麻的引脚吓到——但别担心,今天我们要用STM32CubeMX这个神器,像搭积木一样轻松配置出精准的PWM波形。我清…...
TouchGal:打造纯净Galgame社区的5个简单步骤
TouchGal:打造纯净Galgame社区的5个简单步骤 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next TouchGal是一个专为视觉小说…...
MPO光纤跳线:从结构解析到数据中心高密度布线实战
1. MPO光纤跳线:高密度布线的秘密武器 第一次接触MPO光纤跳线时,我被它的"小身材大容量"震惊了。这个看起来和普通SC连接器差不多大小的家伙,居然能塞下12根甚至24根光纤!这就像在普通U盘大小的空间里装下了整个移动硬盘…...
