思路:我们知道Arraylist底层是数组,所以当我们创建Arraylist对象时就是调用空构造器,让构造器来帮我们创建好一个长度为10(自己拟定的长度)的数组,然后我们可以调用内部提供的各种发放来操作ArrayList,所以让我们自己来手写一个ArrayList。
**第一步:**让我们由简单到难分布完成,先写一个只有增加的而且没有范型的ArrayList。
package 手工实现ArrayList;
/**
* 手工实现ArrayList
*
*/
public class HWArrayList {
private Object[] elementDate; //自定义数组
private int size; //数组大小
/**
* 构造器
*/
public HWArrayList() {
elementDate=new Object[10];//自定义数组长度为10,当我们创建这个类对象时会自动调用空构造器来创建这个数组
}
/**
* 增加方法
* @param obj
*/
public void add(Object obj) {
elementDate[size++]=obj; //调用增加方法其实就是给这个数组加值
}
/**
* 为了输出保持与原本一样,重写了toString
*/
@Override
public String toString() {
StringBuilder sb =new StringBuilder();
sb.append("[");
for(int i=0;i<size;i++) {
sb.append(elementDate[i]+",");
}
sb.setCharAt(sb.length()-1,']');
return sb.toString();
}
public static void main(String[] args) {
HWArrayList hw=new HWArrayList();
hw.add("自定义ArrayList");
hw.add("自定义ArrayList2");
System.out.println(hw);
}
}
第二步: 给add方法增加自动扩容,我们知道ArrayList不需要声明长度,使用为内部可以判断长度是否满,如果满则自动扩容,而扩容说明白了就是创建一个新的且容量比原数组大的数组,然后将旧数组的内容拷贝到新数组,且还多余出来了位置,再将新数组赋值给旧数组,这样就实现了自动扩容。
重点看add方法::::
package 手工实现ArrayList;
/**
* 手工实现ArrayList
*
*/
public class HWArrayList {
private Object[] elementDate; //自定义数组
private int size; //数组大小
/**
* 构造器
*/
public HWArrayList() {
elementDate=new Object[10];//自定义数组长度为10,当我们创建这个类对象时会自动调用空构造器来创建这个数组
}
/**
* 增加方法
* @param obj
*/
public void add(Object obj) {
//判断数组长度是否满,如果满则扩容
if(size==elementDate.length) {
//创建一个新的数组,每次创建数组长度+5
Object[] newelementDate =new Object[elementDate.length+5];
//将旧数组内容拷贝到新数组里
//这是一个内部拷贝方法
System.arraycopy(elementDate, 0, newelementDate, 0, elementDate.length);
//然后将新数组赋值给旧数组,这样就完成了数组扩容
elementDate=newelementDate;
}
//如果数组长度没满则按照原来方法加入数据
elementDate[size++]=obj; //调用增加方法其实就是给这个数组加值
}
/**
* 为了输出保持与原本一样,重写了toString
*/
@Override
public String toString() {
StringBuilder sb =new StringBuilder();
sb.append("[");
for(int i=0;i<size;i++) {
sb.append(elementDate[i]+",");
}
sb.setCharAt(sb.length()-1,']');
return sb.toString();
}
public static void main(String[] args) {
HWArrayList hw=new HWArrayList();
hw.add("自定义ArrayList");
hw.add("自定义ArrayList2");
System.out.println(hw);
}
}
接下来就是手写中,其余方法的扩充 :Ection(int index)判断索引是否合法发放 ,remove(int index)给以索引来清除对应值 ,remove(E element)给一个值去查找有没有如果有就删除 ,
其中重点看看 remove(index) 方法,过程很简单,给一个index,先判断索引是否合法,如果合法:依旧是对数组进行copy,只不过,先想法算出拷贝的长度,计算方法是:elementDate.length-index-1,
不会的可以拿纸算一算,有了拷贝长度以后就可以对数组进行copy,就是将index+1的值拷贝到index上
代码如下:
package 手工实现ArrayList;
/**
* 手工实现ArrayList
*
*/
public class HWArrayList<E> {
private Object[] elementDate; //自定义数组
private int size; //数组大小
/**
* 构造器
*/
public HWArrayList() {
elementDate=new Object[10];//自定义数组长度为10,当我们创建这个类对象时会自动调用空构造器来创建这个数组
}
/**
* 增加方法
* @param obj
*/
public void add(E obj) {
//判断数组长度是否满,如果满则扩容
if(size==elementDate.length) {
//创建一个新的数组,每次创建数组长度+5
Object[] newelementDate =new Object[elementDate.length+5];
//将旧数组内容拷贝到新数组里
//这是一个内部拷贝方法
System.arraycopy(elementDate, 0, newelementDate, 0, elementDate.length);
//然后将新数组赋值给旧数组,这样就完成了数组扩容
elementDate=newelementDate;
}
//如果数组长度没满则按照原来方法加入数据
elementDate[size++]=obj; //调用增加方法其实就是给这个数组加值
}
//删除方法
public void remove(int index) {
Ection(index);
int sumber=elementDate.length-index-1;
if(sumber>0) {
System.arraycopy(elementDate, index+1, elementDate, index, sumber);
}
elementDate[size-1]=null;
size--;
}
/**
* 给值删除
* @param element
*/
public void remove(E element) {
for(int i=0;i<size;i++) {
if(element.equals(elementDate[i])) {
remove(i);
}
}
}
/**
* 判断索引是否在数组范围内
* @param index
*/
public void Ection(int index) {
if(index<0||index>size) {
throw new RuntimeException("索引不合法:"+index);
}
}
/**
* set方法
* @param element
* @param index
*/
public void set(E element,int index) {
Ection(index);
elementDate[index]=element;
}
/**
* get方法
* @param index
* @return
*/
public E get(int index) {
Ection(index);
return (E)elementDate[index];
}
/**
* 为了输出保持与原本一样,重写了toString
*/
@Override
public String toString() {
StringBuilder sb =new StringBuilder();
sb.append("[");
for(int i=0;i<size;i++) {
sb.append(elementDate[i]+",");
}
sb.setCharAt(sb.length()-1,']');
return sb.toString();
}
public static void main(String[] args) {
HWArrayList hw=new HWArrayList();
hw.add("自定义ArrayList");
hw.add("自定义ArrayList2");
System.out.println(hw);
}
}
谢谢!!如有不对请联系,我加以改正!!!!