手写ArrayList集合:MyArrayList

手写ArrayList集合:MyArrayList



前言

查看源代码可以帮助我们快速提高程序员的编程素养。了解底层运作的原理。所以要学会分析底层的代码,锻炼自己的分析能力。


提示:以下是本篇文章正文内容:

一、主要功能:

在这里插入图片描述

二、代码实现:

1.MyConsumer函数式接口:

@FunctionalInterface
public interface MyConsumer<E> {
    void accept(E e);
}

2.MyArrayList类:

import java.util.Arrays;
import java.util.Objects;

public class MyArrayList<E> {
    private Object[] elementData = {};//内部使用数组做容器
    private int size;//元素个数
    private int DEFAULT_CAPACITY = 10;//默认容量

    public boolean add(E e) {
        //注意7:先判断是否需要扩容
        if (size == elementData.length) {
            grow();
        }
        elementData[size++] = e;
        return true;
    }

    public E remove(int index) {
        //先检查索引
        checkIndex(index);
        E e = (E) elementData[index];
        //注意6:计算需要“移位”的个数:5 - 4 - 1 == 0
        int moveNum = size - index - 1;
        if (moveNum != 0) {
            //注意3:将index+1后的movenum个元素往前移动一位。
            System.arraycopy(elementData, index + 1, elementData, index, moveNum);
        }
        elementData[--size] = null;
        return e;
    }

    public E get(int index) {
        checkIndex(index);
        return (E) elementData[index];
    }

    public int size() {
        return size;
    }

    public void forEach(MyConsumer<E> action) {
        //注意4:检查集合是否为null:如果是,抛出空指针异常
        Objects.requireNonNull(action);
        for (int i = 0; i < size; i++) {
            action.accept((E) elementData[i]);
        }
    }

    private void checkIndex(int index) {
        //注意2:如果index越界,就抛出异常,有“前后界”。
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException(index + " out of max length " + size);
        }
    }

    private void grow() {
        //1.第一次扩容
        if (size == 0) elementData = new Object[DEFAULT_CAPACITY];
            //2.其他
            //注意1:1+(1>>2) = 1.5
        else elementData = Arrays.copyOf(elementData, elementData.length + (elementData.length >> 2));
    }

    //注意5:重写tostring方法,按照合适的格式在,控制台展示数据。
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; i < size; i++) {
            E e = (E) elementData[i];
            sb.append(e).append(i == size - 1 ? "" : ", ");
        }
        sb.append("]");
        return sb.toString();
    }
}

在这里插入图片描述

3.测试类:

在这里插入图片描述

三、注意点:

在这里插入图片描述

1.扩容

2.索引越界判断

3.移位

4.lambda表达式

5.函数式接口

6.抛异常

7.合适的tostring方法

四、与官方代码相比较:

扩容,检查索引范围,删除元素,遍历,添加元素

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


总结

提示:这里对文章进行总结:
多看,多分析,多理解,多实现。

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,让我们开始创建 MyArrayList 类。 ```java public class MyArrayList<E> { private static final int DEFAULT_CAPACITY = 10; private Object[] elementData; private int size = 0; public MyArrayList() { elementData = new Object[DEFAULT_CAPACITY]; } public MyArrayList(int initialCapacity) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); elementData = new Object[initialCapacity]; } public void add(E e) { if (size == elementData.length) { ensureCapacity(); } elementData[size++] = e; } @SuppressWarnings("unchecked") public E get(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } return (E) elementData[index]; } public E remove(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } E removedElement = get(index); for (int i = index; i < size - 1; i++) { elementData[i] = elementData[i + 1]; } elementData[--size] = null; return removedElement; } public int size() { return size; } private void ensureCapacity() { int newCapacity = elementData.length * 2; elementData = Arrays.copyOf(elementData, newCapacity); } } ``` 这里我们使用了泛型,这样就可以让 MyArrayList 类型安全地存储任何类型的对象。我们还定义了两个构造函数,一个是使用默认容量创建 MyArrayList 对象,另一个是可以指定容量的构造函数。 add() 方法用于将元素添加到 MyArrayList 中。如果 MyArrayList 已满,我们就需要扩容,这里我们使用了一个 ensureCapacity() 方法来实现。get() 方法用于获取指定索引位置上的元素,remove() 方法用于删除指定索引位置上的元素,size() 方法用于获取 MyArrayList 中元素的数量。 这就是我们的 MyArrayList 类的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lennard-lhz

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

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

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

打赏作者

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

抵扣说明:

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

余额充值