手写.ArrayList 实现要求:包括add、get、size、indexOf、remove方法的实现。
时间: 2023-07-10 10:30:09 浏览: 78
好的,我可以帮你解答这个问题。下面是手写 ArrayList 实现的代码:
```java
public class ArrayList<E> {
private static final int DEFAULT_CAPACITY = 10;
private Object[] elementData;
private int size;
public ArrayList() {
elementData = new Object[DEFAULT_CAPACITY];
}
public void add(E e) {
ensureCapacity(size + 1);
elementData[size++] = e;
}
public E get(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
return (E) elementData[index];
}
public int size() {
return size;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++) {
if (elementData[i] == null) {
return i;
}
}
} else {
for (int i = 0; i < size; i++) {
if (o.equals(elementData[i])) {
return i;
}
}
}
return -1;
}
public boolean remove(Object o) {
int index = indexOf(o);
if (index >= 0) {
remove(index);
return true;
}
return false;
}
public E remove(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
E oldValue = (E) elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0) {
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
}
elementData[--size] = null;
return oldValue;
}
private void ensureCapacity(int minCapacity) {
if (minCapacity > elementData.length) {
int newCapacity = elementData.length * 2;
if (newCapacity < minCapacity) {
newCapacity = minCapacity;
}
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
}
```
在这个实现中,我们使用了一个 Object 类型的数组来存储元素,每当添加元素时,我们都需要检查数组是否已满,如果已满则需要扩容。同时,我们还实现了 get、size、indexOf、remove 方法,其中 indexOf 方法支持 null 元素的查找。在 remove 方法中,我们使用了 System.arraycopy 方法来移动元素,以保证 ArrayList 的连续性。
阅读全文