组成结构
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
暂无评论内容