相信大家都使用过ArrayList
,它是一个底层基于数组实现的List。
在这里,我们来自定义写一个MyArrayList
首先,我们确认我们所需的功能
//集合可以实现存储指定数据类型
//可以实现对数据的增删改查
//add:可以在末尾添加元素,可以在集合中插入元素
//remove:可以通过下标删除元素,可以通过对象删除出现的第一个元素
//set:可以通过下标更改元素的对象
//get:可以通过下标获取元素对象
//可以实现迭代器,遍历集合
//(小伙伴可以根据自己爱好增加功能)..........
然后,我们开始按需求写接口
package com.shaw.ArrayList;
import java.util.Iterator;
/**
* 自定义数据结构的方法抽象
* @author Lindsey Shaw
* @date 2018年6月11日
*/
public interface MyList<E> {
/**
* 功能描述: 在末尾增加一个元素
*/
boolean add(E obj);
/**
* 功能描述: 在指定下标处插入元素
*/
boolean add(int index, E obj);
/**
* 功能描述: 清除容器所有内容,但容器容量不变
*/
void clear();
/**
* 功能描述: 是否包含对象
*/
boolean contains(Object obj);
/**
* 功能描述: 通过下标得到集合对象
*/
E get(int index);
/**
* 功能描述: 判断集合是否为空
*/
boolean isEmpty();
/**
* 功能描述: 移除下标除的对象
*/
E remove(int index);
/**
* 功能描述: 移除第一个出现的对象
*/
boolean remove(E obj);
/**
* 功能描述: 修改集合下标处对象内容,返回被修改的值
*/
E set(int index, E obj);
/**
* 功能描述: 返回集合大小
*/
int size();
/**
* 功能描述: 将集合返回一个对象数组
*/
E[] toArray();
/**
* 功能描述: 返回集合的迭代器
*/
Iterator<E> iterable();
}
接着我们创建一个实现类实现这个接口所有方法
package com.shaw.ArrayList;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Objects;
/**
* 自定义数据结构,实现基本的增删改查
*
* @author Lindsey Shaw
* @date 2018年6月11日
*/
public class MyArrayList<E> implements MyList<E> {
//初始化容量大小
private static final int default_capacity = 10;
//用于共享空实例数组
private final Object[] Empty_ElementData = {};
//默认数组容器
private Object[] ElementData;
//初始大小
private int size;
//可以通过构造函数改变默认容量
public MyArrayList(int initial) throws IllegalAccessException {
if (initial > 0) {
//当设置值大于0时,按设置值设置
ElementData = new Object[initial];
} else if (initial == 0) {
//设置值等于0时为空
ElementData = Empty_ElementData;
} else {
throw new IllegalAccessException("初始化数值为:" + initial);
}
}
//默认容量为10
public MyArrayList() {
ElementData = new Object[default_capacity];
}
@Override
public boolean add(E obj) {
//验证容量是否需要扩容
CheckCapacity();
ElementData[size++] = obj;
return true;
}
//如果集合大小将要大于容器容量时,就扩容
private void CheckCapacity() {
if (size + 1 > ElementData.length) {
grow();
}
}