ArrayList是一种顺序表,是基于数组实现的,很明显,它的性能和特性和数组是类似的。
这是我根据jdk中List接口实现的ArrayList,我们着重关注add,get方法。
在每次add时,都先进行数组是否已满的判断,如果满了,就需要进行扩容操作,然后在size位置插入元素,因为size代表了当前list的大小,所以数组索引为size的地方就是可以插入的位置。然后很典型的一个操作就是移位操作,因为add方法插入的是数组最后一个位置,所以不需要进行移位操作。至此,List添加操作就已经完成了,可以看出,添加对程序员是透明的,也就是说,List会自动完成扩容,移位等操作,相当便捷。
在get时,根据索引进行get,如果越界,会抛出异常,很直白的过程。
MyArrayList是基于数组实现的,它的插入,检出,删除等操作的性能和数组是十分相似的。
import java.util.Arrays;
public class MyArrayList<E> {
// 初始容量
private static final int DEFAULT_CAPACITY = 10;
// list大小
private int size;
// 实现存储用的数组
private Object[] items;
public MyArrayList() {
clear();
}
public MyArrayList(int initialCapacity) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
this.items = new Object[initialCapacity];
}
/**
* 将表恢复到到默认状态
*/
public void clear() {
size = 0;
ensureCapacity(DEFAULT_CAPACITY);
}
/**
* 确保合适的容量
*
* @param newCapacity
*/
private void ensureCapacity(int newCapacity) {
if (newCapacity < size)
return;
Object[] old = items;
// items = (E[]) new Object[newCapacity];
// for (int i = 0; i < size(); i++) {
// items[i] = old[i];
// }
items = Arrays.copyOf(old, newCapacity);
}
public int size() {
return size;
}
/**
* 根据索引获得元素
*
* @param index
* @return
*/
public E get(int index) {
if (index > size) {
throw new ArrayIndexOutOfBoundsException();
}
return (E) items[index];
}
/**
* 插入新元素,插入位置为size
*
* @param newVal
* @return
*/
public boolean add(E newVal) {
add(size, newVal);
return true;
}
/**
* 在指定位置插入新元素
*
* @param index
* @param newVal
*/
public void add(int index, E newVal) {
if (items.length == size)
ensureCapacity(size * 2 + 1);
for (int i = size; i > index; i--) {
items[i] = items[i - 1];
}
items[index] = newVal;
size++;
}
/**
* 判断是否为空
*
* @return
*/
public boolean isEmpty() {
return size == 0;
}
}
这是我根据jdk中List接口实现的ArrayList,我们着重关注add,get方法。
在每次add时,都先进行数组是否已满的判断,如果满了,就需要进行扩容操作,然后在size位置插入元素,因为size代表了当前list的大小,所以数组索引为size的地方就是可以插入的位置。然后很典型的一个操作就是移位操作,因为add方法插入的是数组最后一个位置,所以不需要进行移位操作。至此,List添加操作就已经完成了,可以看出,添加对程序员是透明的,也就是说,List会自动完成扩容,移位等操作,相当便捷。
在get时,根据索引进行get,如果越界,会抛出异常,很直白的过程。
MyArrayList是基于数组实现的,它的插入,检出,删除等操作的性能和数组是十分相似的。