九霄道长 发表于 2021-6-27 14:46

自己实现一个ArrayList

本帖最后由 九霄道长 于 2021-6-27 14:47 编辑

```java
package Data;

import java.util.Arrays;

/**
* Describe:
* Author: 九霄道长
* CreateTime: 2021/6/25 15:41
*/

public class ArrayPlus<T> {
    /**
   * 主数组容器
   * 泛型 数组
   */
    private T[] data;
    /**
   * 当前元素的个数
   */
    private int size;

    /**
   * 自定义容量
   *
   * @param capacity
   */
    public ArrayPlus(int capacity) {
      //创建一个泛型的指定大小的数组
      this.data = (T[]) new Object;
      this.size = 0;
    }

    /**
   * 默认的空参构造
   */
    public ArrayPlus() {
      this(10);
    }

    /**
   * 当前元素的个数
   *
   * @return
   */
    public int getSize() {
      return this.size;
    }

    /**
   * 获取数组的长度
   */
    public int getLength() {
      return this.data.length;
    }

    /**
   * 判断数组是否为空
   */
    public boolean isEmpty() {
      return this.size == 0;
    }

    /**
   * 尾部添加元素
   *
   * @param e
   */
    public void add(T e) {
      add(size, e);
    }

    /**
   * 头添加元素
   *
   * @param e
   */
    public void addFirst(T e) {
      add(0, e);
    }

    /**
   * 在index位置插入元素
   *
   * @param e
   */
    public void add(int index, T e) {
      checkIndexForAdd(index);
      if (size == data.length) {
            resize(2 * data.length);
      }
      //从插入的位置开始 所有元素往后挪一位
      for (int i = size - 1; i >= index; i--) {
            data = data;
      }
      this.data = e;
      size++;
    }
    // 查看数组是否包含元素e
    public boolean contains(T e) {
      for (int i = 0; i < size; i++) {
            if (data.equals(e)) {
                return true;
            }
      }
      return false;
    }
    /**
   * O(1)级别的交换插入
   *
   * @param index
   * @param e
   */
    public void addPlus(int index, T e) {
      checkIndexForAdd(index);
      if (size == data.length) {
            resize(2 * data.length);
      }
      //把被修改的元素放到最后面
      this.data = this.data;
      this.data = e;
    }

    public T remove(int index) {
      checkIndex(index);

      T ret = data;
      //整体向前挪一位
      for (int i = index + 1; i < size; i++) {
            data = this.data;
      }
      size--;
      data = null;

      // 数组缩容
      if (size <= data.length / 2) {
            resize(data.length / 2);
      }
      return ret;
    }

    /**
   * 查找数组元素
   *
   * @param index
   * @return
   */
    public T get(int index) {
      checkIndex(index);
      return this.data;
    }

    /**
   * 自动扩容
   *
   * @param newSize
   */
    private void resize(int newSize) {
      T[] newArray = (T[]) new Object;
      for (int i = 0; i < size; i++) {
            newArray = this.data;
      }
      this.data = newArray;
    }

    /**
   * 检查下标越界
   *
   * @param index
   */
    private void checkIndex(int index) {
      if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("error!!! 下标越界");
      }
    }

    private void checkIndexForAdd(int index) {
      if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("error!!! 下标越界");
      }
    }

    @Override
    public String toString() {
      return "ArrayPlus{" +
                "data=" + Arrays.toString(data) +
                ", size=" + size +
                '}';
    }
}


```

三木猿 发表于 2021-6-29 13:41

扩容就是把数据换到一个更大数组,不知道有啥更好的办法吗

九霄道长 发表于 2021-6-29 16:42

三木猿 发表于 2021-6-29 13:41
扩容就是把数据换到一个更大数组,不知道有啥更好的办法吗

数组只能这样,链表可以不用

今何许 发表于 2021-7-6 17:48

挺不错的了

kilito 发表于 2021-7-13 13:03

实现代码简洁易懂,赞一个
页: [1]
查看完整版本: 自己实现一个ArrayList