手写集合
1 import java.util.Arrays; 2 3 public class Demo_ArrayList2 4 { 5 public static void main(String[] args) 6 { 7 MyArrayList2<String> my=new MyArrayList2(); 8 my.add("龙"); 9 my.add("只"); 10 my.add("谷"); 11 my.add("之"); 12 my.add("精"); 13 my.add("灵"); 14 my.add("王"); 15 my.add("座"); 16 17 System.out.println(my); 18 my.get(4); 19 System.out.println(my); 20 System.out.println(my.size()); 21 my.set(1, "之"); 22 System.out.println(my); 23 } 24 } 25 26 //手写集合 27 //添加数据 移除数据 获取集合元素的长度 设置指定位置的值 获取数据 打印数据 28 class MyArrayList2<T> 29 { 30 //创建一个Object数组 31 private Object[]obj; 32 //设置数组默认长度 33 private final int DEFAULT=10; 34 //当前集合中存放的元素个数 35 private int size=0; 36 //有参构造函数初始化数组大小 37 public MyArrayList2() 38 { 39 obj=new Object[DEFAULT]; 40 } 41 public MyArrayList2(int capacity) 42 { 43 obj=new Object[capacity]; 44 } 45 //元素打印 46 //打印数据 47 public String toString() 48 { 49 //有多少个元素我们就打印多少个元素 50 return Arrays.toString(Arrays.copyOf(obj, size)); 51 } 52 //添加数据 53 public void add(T ele) 54 { 55 //判断是否需要扩容,如果需要扩容的时候没有扩容,会报数组越界异常 56 ensureCapacityInternal(size);//假设现在已经存放了10个元素 size = 10(数组的长度) 57 obj[size]=ele; 58 size++; 59 } 60 //自动扩容 61 private void ensureCapacityInternal(int size) 62 { 63 if(size>=obj.length) 64 { 65 //这个时候就需要扩容了 66 //原来数组的长度 67 int old=obj.length; 68 //新数组长度 69 int newr=old+(old>>1); 70 obj=Arrays.copyOf(obj, newr);//Arrays是操作数组的工具类,且都是静态方法 71 } 72 } 73 //根据下标获取数据 74 @SuppressWarnings("unchecked") 75 public T get(int index) 76 { 77 return (T) obj[index]; 78 } 79 //获取集合的长度 80 public int size() 81 { 82 return size; 83 } 84 //设置指定位置的值 85 public void set(int index,T ele) 86 { 87 obj[index]=ele; 88 } 89 //移除指定位置的值 90 public void remove(int index) 91 { 92 //创建一个数组和原数组一致 93 Object obj1[]=new Object[obj.length]; 94 //把旧数组的元素移到新数组中 95 System.arraycopy(obj, 0, obj1, 0, index); 96 System.arraycopy(obj, index+1, obj1,index ,obj.length-(index+1)); 97 } 98 }
温馨小提示:public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)src
- 源数组。srcPos
- 源数组中的起始位置。dest
- 目标数组。destPos
- 目标数据中的起始位置。length
- 要复制的数组元素的数量。
要复制的元素个数是不包括结束位置,比如要复制3个元素,只会复制下标为[0][1]
移除数组的方法实质就是第二次复制的时候将新数组的copy的起始位置为要移除的元素位置,
假如index为2,那么第一次会把[0][1]元素复制到新数组中,然后第二次复制的时候将下标为[3]之后的元素复制到新数组中,但是复制的起始位置就是下标为[2]的位置
综上所诉,移除的实质就是覆盖.