📅  最后修改于: 2023-12-03 14:53:36.880000             🧑  作者: Mango
在 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 程序设计和数据结构有兴趣,不妨尝试一下。