实现效果:

需求分析:

可以看到ArrayList容器有很多功能,在指定位置添加元素,在容器末尾添加元素,获取指定位置的元素,获取容器的大小,清空容器的元素,判断容器是否是空的,删除指定位置的元素,删除某一元素等等
现要求同学们把容器的主要功能用数组实现

思维:我们都知道,数组是不可变的,一个数组在被创建的时候,其长度就已经固定住了,不能再改变,但是我们想要往数组里面不断的添加元素,实现ArrayList的效果,这时候我们可以用到数组扩容的思维,其主要思想是,新建一个比当前数组大的数组,将旧数组的元素全部复制到新数组中,新数组中多出来的空位就可添加元素,最后用新数组覆盖旧数组(简而言之,借助了一个较大数组,实现了扩容)具体实例可看下方代码

换言之,我们要实现删除功能,只要创建一个比当前数组小的新数组,再有选择的复制除删除元素之外的其他元素 到新数组中,最后用新数组替换旧数组

//需求:
// 在长度为6的数组[1,2,3,4,5,6]后加上[7,8,9]
// 变成[1,2,3,4,5,6,7,8,9]
//    Arrays.toString(<?>[])方法打印数组内容
public class ArrayExpand {public static void main(String[] args) {int [] array=new int[6];//赋值for (int i=0;i<array.length;i++) {array[i]=i+1;}System.out.println("array:"+Arrays.toString(array));int [] des=new int[]{7,8,9};//数组扩容3个长度System.out.println("des:"+Arrays.toString(des));int [] newArray=new int [array.length+des.length];//旧数组赋值到新数组for (int i = 0; i <array.length ; i++) {newArray[i]=array[i];}//要连接的数组赋值到新数组for (int i = 0; i <des.length; i++) {newArray[array.length+i]=des[i];}//新数组替换旧数组array=newArray;//在java中数组也是一个类,每个类都有toString函数System.out.println("array:"+Arrays.toString(array));}
}

功能图:

功能实现代码:

package 线性结构.数组;import java.util.Arrays;/*** @ProjectName 数据结构* @ClassName Array* @Description //面向对象的数组,实现增删改查(ArrayList底层实现)* @Email 2992794262@qq.com* @Author ASUS* @Date 2021/11/11**/
public class Array {private static Object [] array;//构造方法,初始化数组public Array() {array=new Object[0];}//返回数组长度public  int size(){return  array.length;}//显示数组public void show(){System.out.println(Arrays.toString(array));}//在数组最后增加元素public void add(Object element){Object [] newArray=new Object[array.length+1];//旧数组复制到新数组for (int i = 0; i <array.length ; i++) {newArray[i]=array[i];}newArray[newArray.length-1]=element;//新数组替换旧数组array=newArray;}//在指定位置插入元素public  void add(int index,Object element){//创建一个新的数组Object newArray[]=new Object[array.length+1];//将原数组中的元素放入新数组中for (int i = 0; i < newArray.length; i++) {if(index<0 ||index > array.length-1){throw  new RuntimeException("下标越界");}else{//在插入位置之前if (i<index){newArray[i]=array[i];}//在插入位置之后else if(i>index){newArray[i]=array[i-1];}else{newArray[i]=element;}}}//新数组替换旧数组sarray=newArray;}//删除数组的最后一个元素public static void delete(){//创建一个新的数组Object[]newArray=new Object[array.length-1];//将原数组除最后一个元素之外的其他元素放入新数组中for (int i = 0; i <array.length-1 ; i++) {newArray[i]=array[i];}//新数组替换旧数组array=newArray;}//删除某个位置的元素public void delete(int index){Object [] newArray=new Object[array.length-1];for (int i = 0; i <newArray.length ; i++) {if(index<0 ||index > array.length-1){throw  new RuntimeException("下标越界");}else{//在指定位置之前if(i<index){newArray[i]=array[i];}//在指定位置之后else{newArray[i]=array[i+1];}}}//新数组替换旧数组array=newArray;}//替换指定位置public void set(int index,Object element){array[index]=element;}//查询指定位置的元素public Object get(int index){return array[index];}//线性查找算法实现indexOf底层,返回参数第一次出现的位置public int indexOf(Object element){//没找到返回-1int index=-1;for (int i = 0; i <array.length; i++) {if (array[i].equals(element)){index= i;break;}}return  index;}//清空数组功能public void clear(){Array a=new Array();//把当前的对象的属性数组变成当前对象a.array=array;for (int i = 0; i <array.length ; i++) {a.delete();}}//判空功能public boolean isEmpty(){if (array.length==0){return true;}elsereturn false;}
}

测试类:

package 线性结构.数组;import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** @ProjectName 数据结构* @ClassName TestArray* @Description //* @Email 2992794262@qq.com* @Author ASUS* @Date 2021/11/11**/
public class TestArray {public static void main(String[] args) {Array array=new Array();while(true){System.out.println("1.查看数组大小\t2.判断数组是否为空\t\t3.打印数组元素\t4.清空数组");System.out.println("5.在末尾添加元素\t6.在指定位置添加元素\t7.删除末尾元素\t8.删除指定位置元素");System.out.println("9.替换指定位置元素\t10.查询指定位置元素\t11.获取指定元素第一次出现的下标\t12.退出");Scanner input=new Scanner(System.in);int n=input.nextInt();switch(n){case 1:System.out.println("size = "+array.size());break;case 2:System.out.println("数组是空的 : "+array.isEmpty());break;case 3:array.show();break;case 4:array.clear();System.out.println("数组已清空");break;case 5:System.out.print("请输入你要添加的元素: ");Object element=input.next();array.add(element);System.out.println("添加成功");break;case 6:System.out.print("请输入你要添加的位置: ");int index=input.nextInt();System.out.print("请输入你要添加的元素: ");Object object=input.next();array.add(index,object);System.out.println("添加成功");break;case 7:array.delete();System.out.println("删除成功");break;case 8:System.out.print("请输入你要删除元素的指定位置: ");int i=input.nextInt();array.delete(i);System.out.println("删除成功");break;case 9:System.out.print("请输入你要替换的元素的下标: ");int j=input.nextInt();System.out.print("请输入你要替换的新元素: ");Object object1=input.next();array.set(j,object1);System.out.println("替换成功");break;case 10:System.out.print("请输入你要查询的元素的下标: ");int k=input.nextInt();System.out.println("查询结果:"+array.get(k));break;case 11:System.out.print("请输入你要查询的元素: ");Object object2=input.next();int first=array.indexOf(object2);System.out.println("第一次出现的位置是:"+first);break;default:System.exit(0);}}}
}

【java版数据结构】看完数据结构的顺序结构后,紧接着去实现ArrayList的底层(150行代码,数组扩容,增删改查,但未实现迭代器)相关推荐

  1. java中的数组增删查改操作,java数组实现增删改查

    java 实现动态数组,Java工具类Arrays中不得不知的常用方法,数组实现队列java,java数组实现增删改查 java 增删改查代码 import java.sql.Connection; ...

  2. java里SQL insert操作的语法_Java含个人总结语法:JDBC,学生表,实体类,集合,增删改查,注入,预处理【诗书画唱】...

    create table denglu( uname varchar(30), upwd varchar(30) ) insert into denglu values('诗书','123') ins ...

  3. Java程序员除了做增删改查还能干嘛?

    就以Java后端开发为例,说说不同级别程序员干的事情. 1 初级开发,大概是有3年Java开发经验. 22年底,上海,这批程序员如果学历是本科,薪资一般是8k到2w,当然如果能进好公司或互联网大厂,薪 ...

  4. java中容器里的增删改查_Java工程师的第八天——简单的增删改查的应用

    package day08; import java.util.Scanner; /** * * @author sun changxin * 习题:数组完成增删改查(CRUD) 1.字符串类型的数组 ...

  5. 数据结构,单链表讲解,并使用Java代码实现单链表增删改查【尾部添加,中间插入、修改节点、删除节点、展示链表】

    文章目录 单链表 什么是单链表,链式存储结构详解 链表的节点 头节点,头指针和首元节点 单链表的实现 1.尾部添加新节点 思路分析 代码实现 注意事项 2.按照编号插入新节点 思路分析 代码实现 注意 ...

  6. (数据结构与算法)单链表与双链表增删改查的实现。

    文章目录 链表介绍 1. 单链表应用实例 1.1 实现思路 1.2 代码实现 2.单链表常见面试题 2.1 求单链表中有效节点的个数 2.2 查找单链表中倒数第K个节点 2.3 单链表的反转 2.4 ...

  7. 通用版!完整代码,单链表SingleLinkedList增删改查,反转,逆序,有效数据等Java实现

    文章目录 节点类 链表类(主要) 测试类 小结 节点类 可以根据需要,对节点属性进行修改.注意重写toString()方法,以便后续的输出操作. //节点类 class Node {public in ...

  8. 我在名牌大学毕业后的经历 (看完感动,涌动,后泪流)

    我在名牌大学毕业后的经历 (看完感动,涌动,后泪流) 我是82年,大学毕业3年5个月.现在一家大型市场咨询公司,自己带一个组,月薪16000,未算其他收入与分红.也就是传统意义上的白领打工仔.在北京, ...

  9. 学生管理系统(Java版)(普通版(增删改查)、增强版(登录、注册、忘记密码))

    普通版需求如下: 学生管理系统分为四个部分:增删改查 主菜单: 增部分:(在增加前,我们要判断id的唯一性,因此我们可以遍历ArrayList数组,再调用String的equals方法,进行判断) 删 ...

最新文章

  1. c语言 字符串 url,如何对URL字符串进行百分号编码
  2. 杭电acm 2024 C语言合法标识符
  3. 记录一次手机联系人整理(XML文件格式处理)
  4. 《21天学通Java(第6版)》—— 1.7 问与答
  5. windows 删除php,windows软链接(mklink)的建立及删除的用法示例
  6. windows 清除记录ftp账号
  7. 039.有符号数除法
  8. AI:人工智能领域之国内外人工智能产业应用图谱应用层/基础层详解—AI八大应用领域之医疗/家居/驾驶/零售/城市/教育/金融/交通、(AI三大基础(算法【计算机视觉/自然语言处理/机器学习、科研院所/
  9. QT框架下的OpenGL使用---实战篇---鼠标选取点对象
  10. 2006-10-30 18:37:00 著名Linux内核程序员大鹰 ox啊
  11. 动态规划旅游问题:汽车加满油可以跑n千米,中途有若干个加油站,请用动态规划的方式求解中途加油次数最少的方案。
  12. 板块分析:筑底阶段 智能家居开启蓝海
  13. 根据股票代码特征分类
  14. 系统封装Win10专业版1803
  15. 央视网采用国产8K摄像机直播2022年度最大超级月亮
  16. python——用Turtle画画写名字
  17. 攻防世界--进阶区--forgot
  18. 软件开发基础知识(1)
  19. 应届生找嵌入式工作难吗?
  20. 电脑在线如何一键重装win10系统?电脑在线一键重装系统win10步骤

热门文章

  1. 如何用卷积神经网络预测股票波动率?(附Python代码)
  2. fluent linux运行算例,Fluent算例精选|03利用VOF和蒸发-冷凝模型
  3. 台式计算机连不上网,台式电脑连接不上网络怎么办
  4. java语言中的合法的变量名_合法的变量名
  5. linux恢复rm命令,Linux系统下不小心使用rm命令删除的文件能有办法恢復吗?
  6. 机器人的发展及其概述
  7. linux中more命令的意思,linux中的more命令的详细解释
  8. 色彩标准709loghlg
  9. Android开发之Compose基础学习-Divider分割线控件的基本用法
  10. 信息系统监理师(二)