ArrayList——复刻
1.前言
在Java列表中用到的最多的就是泛型了,所以如果不了解泛型的可以看一下我关于泛型的简介Java——泛型
本篇文章主要就是ArrayList的一个基本的重写,我们会先进行ArrayList和LinkedList的重写,然后抽出共同的部分写成接口,每完成一个阶段我们就对比一下源码。
2. 分析
众所周知,ArrayList的底层其实就是Java的数组。在我看来ArrayList主要就是对数组进行了封装,解决一些我们使用数组的一些痛点,使我们使用的数组的时候更加方便。(当然那时候我们使用的应该就是我们封装的类了)
我们使用数组的时候有那些不方便的地方:
- 数组的大小在创建时就固定,到了就要手动扩容
- 增删改查
3.实现(MyArrayList.class)
ArrayList的实现分析:
- 初始化
a) 有参初始化:参数为初始化的ArrayList列表的大小
b) 无参初始化:默认大小10 private static final int DEFAULT_CAPACITY = 10;- 添加
a) 不指定下标
先判断是否需要扩容,再执行添加程序
b) 指定下标
先判断下标是否比当前的列表拥有的元素个数大,大就保错,小就添加- 删除
a) 按下标删除
通过查找下标来删除元素
b) 按元素删除
通过查找元素是否存在来删除元素(通过equals来比较元素是否相同,自己创建的类如果想要通过这个方法,要重写equals)
3.1 成员属性
数组 E[] e;
默认的创建的数组大小 defauleListLength;
数组中的元素的数量 size
3.2 成员方法
4. 代码
4.1 add
4.1.1 add(E val);
public void add(T x) {
add(size(), x);
}
4.1.2 add(int idx, E val);
public void add(int idx, T x) {
if (t.length == size()) {
capacityExpansion(size() * 2 + 1);
}
for (int i = theSize; i > idx; i--) {
t[i] = t[i - 1];
}
t[idx] = x;
theSize++;
}
private void capacityExpansion(int newLength) {
if (newLength < theSize) {
return;
}
T[] old = t;
t = (T[]) new Object[newLength];
for (int i = 0; i < size(); i++) {
t[i] = old[i];
}
}
4.1.3 addAll(MyArrayList list);
...
4.1.4 addAll(int idx, MyArrayList list);
...
4.2 remove
4.2.1 remove(int idx);
public T remove(int idx) {
T removeItem = t[idx];
for (int i = idx; i < size(); i++) {
t[i] = t[i + 1];
}
theSize--;
return removeItem;
}
4.2.1 remove(E val);
...
4.2.1 remove(MyArrayList list);
...
4.3 set
4.3.1 set(int idx, E val);
public T set(int idx, T newVal) {
if (idx < 0 || idx > size()) {
throw new ArrayIndexOutOfBoundsException();
}
T old = t[idx];
t[idx] = newVal;
return old;
}
4.4 get
4.4.1 get(int idx);
public T get(int idx) {
if (idx < 0 || idx > size()) {
throw new ArrayIndexOutOfBoundsException();
}
return t[idx];
}
4.5 isEmpty
public boolean isEmpty() {
return theSize == 0;
}
4.6 size
public int size() {
return theSize;
}
4.end 完整代码
gitee:https://gitee.com/pylxsky/java-data-type
github:…