前期准备
需要用到的包:诶好像没有需要手动引用的包
好吧,自己从零开始做吧。
动手实践
先把基础搭建好,创建一个类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+目标快捷键查看。