其实重写不难,下面是我重写时定义的一些接口。
/**
* 重写实现一个list
* @author <u>zhoujx</u>
*
*/
public interface MyList<E> {
/**
* 添加一个元素
* @param element 元素
*/
public void add(E element);
/**
* 添加一组元素
* @param elements 一组元素
*/
public void add(E[] elements);
/**
* 删除元素
* @param element 需要删除的元素
* @param allOccurence true就删除所有该元素,false则删除第一次出现的该元素
* @return 元素存在返回true,不存在返回false
*/
public boolean del(E element, boolean allOccurence);
/**
* 删除指定位置的元素
* @param index 指定位置
* @return 返回删除的元素
*/
public E del(int index);
/**
* 删除指定位置的元素
* @param index 指定位置
* @return 返回删除的元素
*/
public E del(E element);
/**
* 更换指定位置的元素
* @param index 元素的位置也就是索引
* @param element
* @return 被更换的老元素
*/
public E set(int index, E element);
/**
* 获取元素
* @param index 元素位置(索引)
* @return 元素
*/
public E get(int index);
/**
* 查找元素首次出现的位置
* @param element 需要查找的元素
* @return 查找到则返回该元素位置,否则返回-1
*/
public int indexOf(E element);
/**
* 使用指定位置获取当前容器的子容器
* @param fromIndex 开始位置(包括)
* @param toIndex 结束位置(不包括)
* @return 子容器
*/
public MyList<E> subList(int fromIndex, int toIndex);
/**
* 是否为空容器
* @return 是返回true,不是返回false
*/
public boolean isEmpty();
/**
* 清空容器
*/
public void clear();
/**
* 获取容器大小
* @return 容器中元素的个数
*/
public int size();
}
使用到的一些方法或者依赖
我在删除使用到System的arraycopy()
System.arraycopy(a, 0, elementData, size, numNew);的意思是将数组a中从下标0开始,到0+numNew=numNew之间的元素移动到elementData数组中,但存放的位置是在size之后的,这样说应该能懂这个方法是干什么的了,这个操作是比较花时间的,所以对于添加和删除操作比较的频繁的时候,LinkedList是要好于ArrayList的,所以平时不要一味的依赖ArrayList。
扩容时使用了Arrays的copyOf()
Arrays的copyOf()方法传回的数组是新的数组对象,所以您改变传回数组中的元素值,也不会影响原来的数组。copyOf()的第二个自变量指定要建立的新数组长度,如果新数组的长度超过原数组的长度,则保留数组默认值
从源码能看出arraylist的好处和坏处,其实不难。
好处就是在调用get()以及set()方法时,因为是基于数组的,有了数组的特性很快。
但是在add()和del()时,需要调用耗时的依赖方法。