简单实现ArrayList功能
来源:互联网 发布:一年php工资7千 编辑:程序博客网 时间:2024/06/05 15:20
前期准备
需要用到的包:诶好像没有需要手动引用的包
好吧,自己从零开始做吧。
动手实践
先把基础搭建好,创建一个类MakeArrayList。
public class MakeArrayList { private Object[] elementData; //定义元素数组 private int size; //定义元素大小 public int getSize(){ return size; } /** * 构造器数量多余一个,必须声明默认构造器 * */ public MakeArrayList(){ //默认数组长度是10 this(10); } /** * 构造器重载 * */ public MakeArrayList(int initialCapacity){ if(initialCapacity<0){ try{ throw new Exception(); }catch (Exception e){ e.printStackTrace(); } } //数组开辟空间 elementData=new Object[initialCapacity]; } }
下一步就开始在类中填充东西进去,不然只有骨架没有血肉可不好看。
按功能划分:
功能1:直接添加元素
/** * 实现功能-添加元素-add * */ public void add(Object obj){ //检查数组是否需要扩容 capacityArray(); //先保存再长度自增 elementData[size++]=obj; }
传入一个对象过来,add方法接收并保存在数组中。哦忘记了,还有一个辅助功能,capacityArray(),用于检查数组是否需要扩充。
/** * 数组扩容和数据复制 * */ public void capacityArray(){ if(size>=elementData.length){ //数组容量扩展为原来2倍+1 Object[] newArray= new Object[size*2+1]; /* * 功能:数组拷贝 * arraycopy(Object src,int srcPos,Object dest,int destPos,int length) * src:源数组 * srcPos:源数组copy起始位置 * dest:目的数组 * destPos:目的数组被copy的起始位置 * length:copy长度,一般为源数组长度 * */ System.arraycopy(elementData,0,newArray,0,elementData.length); //数组替换 elementData=newArray; } }
也可以不用上面的arraycopy方法,自己手动循坏赋值,如下:
for(int i=0;i<elementData.length;i++){ newArray[i]=elementData[i];}
功能2:根据索引添加元素
/** * 实现功能-添加元素:add-找到该索引位置,并将该位置元素向后移动一格,再把新元素添加到该位置 * */ public void add(int index,Object obj){ //索引检查 rangeCheck(index); //检查数组是否需要扩容 capacityArray(); //内容向后移动一位 System.arraycopy(elementData, index, elementData, index + 1, size - index); //插入元素 elementData[index]=obj; size++; }
这里又需要添加一个辅助功能,rangeCheck(index),判断索引是否超出数组大小或者索引非法,如下:
/** * 索引检查 * */ private void rangeCheck(int index){ if(index<0||index>=size){ try{ throw new Exception(); }catch (Exception e){ e.printStackTrace(); } } }
功能3:根据索引替换元素
/** * 实现功能-添加元素:set-在索引位置处替换 * */ public Object set(int index,Object obj){ //检查索引是否符合 rangeCheck(index); //获取原位置对象 Object oldValue=elementData[index]; //替换 elementData[index]=obj; //将原位置的对象返回 return oldValue; }
功能4:是否为空判断
/** * 实现功能-isEmpty判断 * */ public boolean isEmpty(){ //返回true或者false return size==0; }
功能5:取出数据
/** * 实现功能-取出内容 * */ public Object get(int index){ //索引检查 rangeCheck(index); //根据索引返回内容 return elementData[index]; }
功能6:删除记录
/** * 实现功能-删除元素:内容移除 * */ public void fastRemove(int index){ //判断索引是否正确 rangeCheck(index); //根据索引获取之后元素长度 int numMoved=size-index-1; if(numMoved>0){ //数组内容向前移动一位 System.arraycopy(elementData,index+1,elementData,index,numMoved); //原数组最后一位变为null elementData[--size]=null; } } /** * 实现功能-删除元素:获取对象,查找判断 * */ public void remove(Object obj){ for(int i=0;i<size;i++){ if(get(i).equals(obj)){ //调用实际删除操作 fastRemove(i); } } }
执行删除操作时,首先调用remove(Object object)获取对象,再for循环遍历,有符合条件时进行移除。
测试
创建一个测试类
class Test{ /** * 测试功能 * */ public static void main(String args[]) { MakeArrayList list=new MakeArrayList(); }}
在main中添加测试代码。
测试一:直接添加元素
/* * 测试一 * 直接添加元素 * */ System.out.println("测试一:直接添加元素"); list.add("firstTest"); //添加字符串' list.add(new Date()); //添加时间 list.add(1234); //添加常量,自动封装Integer System.out.println("数组长度:"+list.getSize()); System.out.println("数组是否为空:"+list.isEmpty()); for(int i=0;i<list.getSize();i++){ System.out.println("数组内容"+i+":"+list.get(i)); }
结果:
测试二:根据索引添加元素
/* * 测试二 * 根据索引添加元素 * */ System.out.println("测试二:add-根据索引添加元素"); for(int i=0;i<list.getSize();i++){ System.out.println("原数组内容"+i+":"+list.get(i)); } list.add(1,"secondTest"); for(int i=0;i<list.getSize();i++){ System.out.println("添加后,新数组内容"+i+":"+list.get(i)); }
结果:
测试三:根据索引替换元素
/* * 测试三 * 根据索引替换元素 * */ System.out.println("测试三:set-根据索引替换元素"); for(int i=0;i<list.getSize();i++){ System.out.println("原数组内容"+i+":"+list.get(i)); } list.set(1,"thirdTest"); for(int i=0;i<list.getSize();i++){ System.out.println("替换后,数组内容"+i+":"+list.get(i)); }
结果:
测试四:删除元素
/* * 测试四 * 删除元素 * */ System.out.println("测试四:删除元素"); list.add("lisi"); list.add("wangwu"); System.out.println(list.getSize()); for(int i=0;i<list.getSize();i++){ System.out.println("原数组内容"+i+":"+list.get(i)); } list.remove("lisi"); for(int i=0;i<list.getSize();i++){ System.out.println("删除后,数组内容"+i+":"+list.get(i)); }
结果:
OK!到此已经完成了功能的实现,如果想不出原理,可以查看ArrayList原版是整么实现的,eclipse和IDEA都有提示,Ctrl+目标快捷键查看。
阅读全文
0 0
- 简单实现ArrayList功能
- js实现ArrayList功能
- 简单实现ArrayList
- 实现简单arrayList
- 简单实现一个ArrayList
- 简单实现Java中的ArrayList
- ArrayList简单实现Java版
- Java手动实现简单 ArrayList
- 简单实现java中ArrayList
- 设计简单的ArrayList集合功能
- 模拟实现ArrayList的部分功能
- 数据结构: Java中ArrayList的简单实现
- java的ArrayList的简单实现
- 用java实现一个简单的ArrayList
- 手动实现简单的ArrayList底层
- ArrayList的简单实现(手写)
- ArrayList和LinkedList的简单实现
- 数据结构之ArrayList的简单实现
- Spring Boot 学习笔记(三)
- 活动的使用how to build and use an activity
- 删除当前数据库所有的表 过程
- 【linux】串口编程(一)——配置串口
- Centos 7.x yum安装php5.6.X(最新版)
- 简单实现ArrayList功能
- 搜索系统11:协同过滤的数据源和遗留问题
- 到底什么是故事点(Story Point)?
- TensorFlow安装(安装bazel,配置TensorFlow编译环境,利用源码安装TensorFlow)
- 分享三种CSV转PDF方法
- 最近5年Java面试问题列表
- CSS网格布局(Grid)完全教程
- ASP 简单结合kindeditor实现多图上传,可以自由移动图片顺序,删除
- 如何在github里面上传代码和数据,这样R语言就可以直接读取了导入了