1
+ /**
2
+ * @Title: ArrayList.java
3
+ * @Description: TODO(用一句话描述该文件做什么)
4
+ * @author glorychou
5
+ * @date 2017年2月22日 下午10:41:58
6
+ */
7
+ package per .zyf .bds ;
8
+
9
+ import java .util .Arrays ;
10
+
11
+ /**
12
+ * ArrayList的存储结构其实就是一维数组
13
+ * 只不过在这个类中将对数组的一些操作(包括添加元素、删除元素等)封装了起来
14
+ * @author glorychou
15
+ *
16
+ * @param <E>
17
+ * @see per.zyf.bds.List<E>
18
+ */
19
+ public class ArrayList <E > implements List <E > {
20
+ // 默认数组大小
21
+ private static final int DEFAULT_CAPACITY = 10 ;
22
+
23
+ // 数组实际大小
24
+ private int size ;
25
+
26
+ // 存储元素的数组
27
+ protected Object [] elementData ;
28
+
29
+ // 一个用来记录初始状态的空数组实例
30
+ private static final Object [] CAPACITY_EMPTY_ELEMENTDATA = {};
31
+
32
+ /***
33
+ * 构造初始元素数组
34
+ */
35
+ public ArrayList () {
36
+ this .elementData = CAPACITY_EMPTY_ELEMENTDATA ;
37
+ }
38
+
39
+ /***
40
+ *
41
+ * @Description: 在末尾添加元素
42
+ * @param e 元素
43
+ */
44
+ @ Override
45
+ public boolean add (E e ) {
46
+ int minCapacity = size + 1 ;
47
+
48
+ // 判断数组中是否有元素
49
+ if (elementData == CAPACITY_EMPTY_ELEMENTDATA ) {
50
+ minCapacity = Math .max (DEFAULT_CAPACITY , minCapacity );
51
+ }
52
+
53
+ // 判断是否溢出
54
+ if (minCapacity - elementData .length > 0 )
55
+ grow (minCapacity );
56
+
57
+ // 添加元素
58
+ elementData [size ++] = e ;
59
+
60
+ return true ;
61
+ }
62
+
63
+ /***
64
+ *
65
+ * @Description: 在索引指定位置增加元素
66
+ * @param index 索引
67
+ * @param e 元素
68
+ */
69
+ @ Override
70
+ public boolean add (int index , E e ) {
71
+ int minCapacity = size + 1 ;
72
+
73
+ // 索引位置不合法抛出异常
74
+ rangeCheck (index );
75
+
76
+ // 判断数组中是否有元素
77
+ if (elementData == CAPACITY_EMPTY_ELEMENTDATA ) {
78
+ minCapacity = Math .max (DEFAULT_CAPACITY , minCapacity );
79
+ }
80
+
81
+ // 判断是否溢出
82
+ if (minCapacity - elementData .length > 0 )
83
+ grow (minCapacity );
84
+
85
+ // 插入点后的元素后移
86
+ System .arraycopy (elementData , index , elementData , index + 1 , size - index );
87
+
88
+ // 在索引处加入数据
89
+ elementData [index ] = e ;
90
+
91
+ return true ;
92
+ }
93
+
94
+ /***
95
+ *
96
+ * @Description: 得到索引指定位置的元素
97
+ * @param index 索引
98
+ * @return E 索引指定的元素
99
+ */
100
+ @ Override
101
+ @ SuppressWarnings ("unchecked" )
102
+ public E get (int index ) {
103
+ // 索引位置不合法抛出异常
104
+ rangeCheck (index );
105
+
106
+ return (E ) elementData [index ];
107
+ }
108
+
109
+ /***
110
+ *
111
+ * @Description: 删除索引指定位置的元素
112
+ * @param index 索引
113
+ * @return void
114
+ */
115
+ @ Override
116
+ @ SuppressWarnings ("unchecked" )
117
+ public E remove (int index ) {
118
+ // 索引位置不合法抛出异常
119
+ rangeCheck (index );
120
+
121
+ E removeElement = (E ) elementData [index ];
122
+
123
+ // 将要移除元素后的元素前移
124
+ System .arraycopy (elementData , index + 1 , elementData , index , size - index - 1 );
125
+ // 数组大小减一,并清除多余元素
126
+ elementData [--size ] = null ;
127
+
128
+ return removeElement ;
129
+ }
130
+
131
+ /*
132
+ * @see per.zyf.bds.List#size()
133
+ */
134
+ @ Override
135
+ public int size () {
136
+ return size ;
137
+ }
138
+
139
+
140
+ /*
141
+ * @see per.zyf.bds.List#isEmpty()
142
+ */
143
+ @ Override
144
+ public boolean isEmpty () {
145
+ if (elementData == CAPACITY_EMPTY_ELEMENTDATA ) {
146
+ return true ;
147
+ }
148
+ return false ;
149
+ }
150
+
151
+ /***
152
+ *
153
+ * @Description: 溢出时增长空间
154
+ * @param minCapacity 最小容量
155
+ * @return void
156
+ */
157
+ private void grow (int minCapacity ) {
158
+ int oldCapacity = elementData .length ;
159
+ // 容量增大一半
160
+ int newCapacity = oldCapacity + (oldCapacity >> 1 );
161
+ elementData = Arrays .copyOf (elementData , newCapacity );
162
+ }
163
+
164
+ /***
165
+ *
166
+ * @Description: 索引范围检查
167
+ * @param index 索引
168
+ * @return void
169
+ */
170
+ private void rangeCheck (int index ) {
171
+ if (index < 0 || index > size )
172
+ throw new IndexOutOfBoundsException ("Index: " + index + ", Size: " + size );
173
+ }
174
+ }
0 commit comments