浅谈自定义ArrayList的实现2014-07-11 iteye cq520使用数组来实现自定义ArrayList,除了基本的增删查改等方法之外,还添加了API中所使用到的一些方法,方便大家更好的理解ArrayList的实现,具体实现都有解释,主函数中给出了测试方法,代码如下:Java代码
/*** 自定义泛型列表* @author 陈强* @param <E>*/public class MyArrayList<E> {Object[] data=new Object[0];//初始数组,定义一个对象类型的数组保存数据public static void main(String args[]){//创建Integer类型的数组列表MyArrayList<Integer> my=new MyArrayList<Integer>();//添加元素for(int i=1;i<=5;i++){my.add(i);}//my.removeFromTo(1, 3);my.add(1);//my.turnArray();//System.out.println("首次出现指定元素的位置是"+my.IndexOf(1));System.out.println("最后一次出现指定元素的位置是"+my.LastIndexOf(1));System.out.println("队列当前的长度是"+my.size());my.print();//System.out.println("获取的元素"+my.get(1));}/*** 打印队列元素的方法*/public void print(){int length=data.length;for(int i=0;i<length;i++){System.out.print(data[i]+" ");}}/***添加元素的方法* @param e*/public void add(E e){int length=data.length;//获取当前数组的长度Object[] dest=new Object[length+1];//创建一个新数组//先将原数组中的元素都复制过来for(int i=0;i<length;i++){dest[i]=data[i];}dest[length]=e;//添加新元素data=dest;//用新数组替换原来的数组}/*** 插入元素的方法* @param index 指定的下标* @param e 插入的元素*/public void insert(int index,E e){int length=data.length;Object[] dest=new Object[length+1];for(int i=0;i<index;i++){//将索引前的元素先复制过来dest[i]=data[i];}dest[index]=e;//添加新元素到索引位置for(int j=index;j<length;j++){//再将后面一部分元素复制过来dest[j+1]=data[j];}data=dest;}/*** 删除元素的方法* @param index 指定的下标*/@SuppressWarnings("unchecked")public E remove(int index){int length=data.length;Object[] dest=new Object[length-1];for(int i=0;i<index;i++){//将索引前的元素复制过来dest[i]=data[i];}for(int j=index+1;j<length;j++){//跳过索引指定的位置dest[j-1]=data[j];}data=dest;return (E)data[index];//得到被移除的元素}/*** 移除所有元素的方法*/public void removeAll(){Object dest[]=new Object[0];data=dest;}/*** 获取队列的长度*/public int size(){return data.length;}/*** 获取指定下标的元素*/@SuppressWarnings("unchecked")public E get(int index){return (E) data[index];}/*** 判断队列是否为空*/public boolean isEmpty(){return size()==0;}/*** 改变指定下标位置的元素的方法* @param index* @param e*/public void set(int index,E e){//方法类似插入的方法int length=data.length;Object[] dest=new Object[length];for(int i=0;i<index;i++){dest[i]=data[i];}dest[index]=e;//改变指定位置的元素for(int j=index+1;j<length;j++){dest[j]=data[j];}data=dest;}/*** 删除从某一个下标位置开始到某一个下标位置结束的中间元素* @param start 开始位置的下标* @param end 结束位置的下标*/public void removeFromTo(int start,int end){int length=data.length;Object dest[]=new Object[length-(end-start)-1];for(int i=0;i<start;i++){dest[i]=data[i];}for(int j=end+1;j<length;j++){dest[j-(end-start)-1]=data[j];}data=dest;}/*** 将列表翻转*/public void turnArray(){int length=data.length;int j=length-1;Object temp;for(int i=0;i<length/2;i++){temp=data[j];data[j]=data[i];data[i]=temp;j--;}}/*** 搜索列表中首次出现指定元素的位置,如果不存在该元素则返回-1* @param obj*/public int IndexOf(Object obj){int length=data.length;for(int i=0;i<length;i++){if(data[i]==obj){return i;}}return -1;}/*** 搜索列表中最后一个出现指定元素的位置,如果不存在则返回-1* @param obj 指定元素*/public int LastIndexOf(Object obj){int length=data.length;for(int i=length-1;i>=0;i--){if(data[i]==obj){return i;}}return -1;}}