手写集合

 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]的位置
综上所诉,移除的实质就是覆盖.
posted @ 2018-11-29 10:59  静心*尽力  阅读(173)  评论(0编辑  收藏  举报