首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

1-2、ArrayList的模拟兑现

2012-10-05 
1-2、ArrayList的模拟实现ArrayList是一种顺序表,是基于数组实现的,很明显,它的性能和特性和数组是类似的。i

1-2、ArrayList的模拟实现
ArrayList是一种顺序表,是基于数组实现的,很明显,它的性能和特性和数组是类似的。

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是基于数组实现的,它的插入,检出,删除等操作的性能和数组是十分相似的。

热点排行