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]的位置
综上所诉,移除的实质就是覆盖.