📜  实现ArrayList API的Java程序(1)

📅  最后修改于: 2023-12-03 14:53:36.880000             🧑  作者: Mango

实现 ArrayList API 的 Java 程序

简介

在 Java 语言中,ArrayList 是一个非常常用的动态数组。它的 API 提供了添加、删除、修改、查询以及其他方便的操作。在这篇文章中,我们将介绍如何实现 ArrayList API 的 Java 程序。

实现

我们首先要实现 ArrayList 中的基本操作,例如添加元素、删除元素、获取元素以及获取 ArrayList 的长度等。下面是一个简单的实现:

public class ArrayList<E> {
    private Object[] elements;
    private int size;

    public ArrayList() {
        elements = new Object[10];
        size = 0;
    }

    public void add(E e) {
        if (size == elements.length) {
            Object[] newElements = new Object[2 * size];
            System.arraycopy(elements, 0, newElements, 0, size);
            elements = newElements;
        }
        elements[size++] = e;
    }

    public void remove(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        System.arraycopy(elements, index + 1, elements, index, size - index - 1);
        size--;
    }

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

    public int size() {
        return size;
    }
}

这个实现使用了一个基于数组的实现。我们使用一个 Object 类型的数组来存储 ArrayList 中的元素。在添加元素时,如果数组已经满了,我们会将数组扩大为原来的两倍。在删除元素时,我们使用数组的 System.arraycopy 方法将被删除元素后面的其他元素向前移动一个位置。在获取元素时,我们使用强制类型转换将 Object 类型的元素转换为泛型类型。在获取 ArrayList 的长度时,我们返回 size 变量的值。

接下来,我们可以添加更多的操作,例如清空 ArrayList,查询元素在 ArrayList 中的位置等。下面是一个更加完整的实现:

public class ArrayList<E> {
    private Object[] elements;
    private int size;

    public ArrayList() {
        elements = new Object[10];
        size = 0;
    }

    public void add(E e) {
        if (size == elements.length) {
            Object[] newElements = new Object[2 * size];
            System.arraycopy(elements, 0, newElements, 0, size);
            elements = newElements;
        }
        elements[size++] = e;
    }

    public void remove(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        System.arraycopy(elements, index + 1, elements, index, size - index - 1);
        size--;
    }

    public void clear() {
        elements = new Object[10];
        size = 0;
    }

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

    public int size() {
        return size;
    }

    public int indexOf(E e) {
        for (int i = 0; i < size; i++) {
            if (elements[i].equals(e)) {
                return i;
            }
        }
        return -1;
    }
}

在这个更加完整的实现中,我们添加了 clear 方法来清空 ArrayList;添加了 indexOf 方法来查询元素在 ArrayList 中的位置。

测试

我们可以编写一些单元测试来测试我们的 ArrayList 实现是否正确。下面是一个简单的测试:

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

public class ArrayListTest {
    private ArrayList<Integer> arrayList;

    @Before
    public void setUp() {
        arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
    }

    @Test
    public void testAdd() {
        arrayList.add(4);
        assertEquals(4, arrayList.size());
        assertEquals(Integer.valueOf(4), arrayList.get(3));
    }

    @Test
    public void testRemove() {
        arrayList.remove(1);
        assertEquals(2, arrayList.size());
        assertEquals(Integer.valueOf(1), arrayList.get(0));
        assertEquals(Integer.valueOf(3), arrayList.get(1));
    }

    @Test
    public void testClear() {
        arrayList.clear();
        assertEquals(0, arrayList.size());
    }

    @Test
    public void testGet() {
        assertEquals(Integer.valueOf(2), arrayList.get(1));
    }

    @Test
    public void testSize() {
        assertEquals(3, arrayList.size());
    }

    @Test
    public void testIndexOf() {
        assertEquals(1, arrayList.indexOf(2));
        assertEquals(-1, arrayList.indexOf(4));
    }
}

这个测试使用了 JUnit 框架,可以通过在命令行中运行 mvn test 命令来执行。

总结

在这篇文章中,我们实现了 ArrayList API 的 Java 程序,并编写了一些单元测试来测试它的正确性。实现一个 ArrayList 是一个很好的练习,如果你对 Java 程序设计和数据结构有兴趣,不妨尝试一下。