ArrayList——复刻

ArrayList——复刻

1.前言

在Java列表中用到的最多的就是泛型了,所以如果不了解泛型的可以看一下我关于泛型的简介Java——泛型
本篇文章主要就是ArrayList的一个基本的重写,我们会先进行ArrayList和LinkedList的重写,然后抽出共同的部分写成接口,每完成一个阶段我们就对比一下源码。

2. 分析

众所周知,ArrayList的底层其实就是Java的数组。在我看来ArrayList主要就是对数组进行了封装,解决一些我们使用数组的一些痛点,使我们使用的数组的时候更加方便。(当然那时候我们使用的应该就是我们封装的类了)
我们使用数组的时候有那些不方便的地方:

  • 数组的大小在创建时就固定,到了就要手动扩容
  • 增删改查

3.实现(MyArrayList.class)

ArrayList的实现分析:

  1. 初始化
    a) 有参初始化:参数为初始化的ArrayList列表的大小
    b) 无参初始化:默认大小10 private static final int DEFAULT_CAPACITY = 10;
  2. 添加
    a) 不指定下标
    先判断是否需要扩容,再执行添加程序
    b) 指定下标
    先判断下标是否比当前的列表拥有的元素个数大,大就保错,小就添加
  3. 删除
    a) 按下标删除
    通过查找下标来删除元素
    b) 按元素删除
    通过查找元素是否存在来删除元素(通过equals来比较元素是否相同,自己创建的类如果想要通过这个方法,要重写equals)

3.1 成员属性

数组 E[] e;
默认的创建的数组大小 defauleListLength;
数组中的元素的数量 size

3.2 成员方法

  1. add
    add(E val);
    add(int idx, E val);
    addAll(MyArrayList list);
    addAll(int idx, MyArrayList list);
  2. remove
    remove(int idx);
    remove(E val);
    remove(MyArrayList list);
  3. set
    set(int idx, E val);
  4. get
    get(int idx);
  5. isEmpty();
  6. size();

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:…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学编程的小猫猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值