手写ArrayList

组成结构

ArrayList 的实现非常简单,主要包括以下几个部分:

  • 成员变量:元素数组、数组中元素数、修改次数。
  • 构造方法:无参构造方法和带参构造方法。
  • 常用方法:size、isEmpty、contains、get、set、add、remove、clear。 
  • 扩容方法:grow。

ArrayList 的实现非常简单,但它却非常高效,这是因为 ArrayList 底层是用数组实现的,而数组在内存中是连续存储的,因此可以通过第一个元素的存储地址和偏移量offset直接计算得到访问的元素的存储地址。 另外,ArrayList 还实现了 RandomAccess 接口,这表示按下标读取数据速度很快。 总的来说,ArrayList 是一个非常高效的集合类,在日常开发中非常常用。

代码实现

以下是 Java 手写 ArrayList 的实现:

public class ArrayList<E> {

    private static final int DEFAULT_CAPACITY = 10;

    private Object[] elements;

    private int size;

    private int modCount;

    public ArrayList() {
        this(DEFAULT_CAPACITY);
    }

    public ArrayList(int initialCapacity) {
        if (initialCapacity < 0) {
            throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
        }
        elements = new Object[initialCapacity];
    }

    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public boolean contains(Object o) {
        for (int i = 0; i < size; i++) {
            if (elements[i].equals(o)) {
                return true;
            }
        }
        return false;
    }

    public E get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        return (E) elements[index];
    }

    public E set(int index, E element) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        E oldElement = (E) elements[index];
        elements[index] = element;
        return oldElement;
    }

    public void add(E element) {
        add(size, element);
    }

    public void add(int index, E element) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        if (size == elements.length) {
            grow();
        }
        System.arraycopy(elements, index, elements, index + 1, size - index);
        elements[index] = element;
        size++;
        modCount++;
    }

    public E remove(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        E oldElement = (E) elements[index];
        System.arraycopy(elements, index + 1, elements, index, size - index - 1);
        elements[size - 1] = null;
        size--;
        modCount++;
        return oldElement;
    }

    public void clear() {
        for (int i = 0; i < size; i++) {
            elements[i] = null;
        }
        size = 0;
        modCount++;
    }

    private void grow() {
        int newCapacity = (int) (elements.length * 1.5);
        Object[] newElements = new Object[newCapacity];
        System.arraycopy(elements, 0, newElements, 0, size);
        elements = newElements;
    }
}

 

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容