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是基于数组实现的,它的插入,检出,删除等操作的性能和数组是十分相似的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值