你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

手写ArrayList,简单实现动态扩容及增删改查等方法

2021/12/10 13:22:20

动态数组(DynamicArray)接口设计

int size(); //元素的数量
​
boolean isEmpty();  //是否为空
​
boolean contains(E element);    //是否包含某个元素
​
void add(E element);    //添加元素
​
E get(int index);   //返回index位置的元素
​
E set(int index, E element);    //设置index位置的元素(替换)
​
void add(int index, E element); //往index位置添加元素
​
E remove(int index);    //删除index位置的元素
​
int indexOf(E element); //查看元素的位置
​
void clear();   //清除所有元素

成员变量

private size;   //容量
​
private elements[] ;    //存放元素的数组
​
private static final int DEFAULT_CAPACITY;  //默认容量
​
private static final int INITCAPACITY;  //初始化容量
​
private static final int ELEMENT_NOT_FOUND; //找不到元素时的返回值

构造器设计

空参

public DynamicArray(){
        this(DEFAULT_CAPACITY);//默认容量10
    }

有参

public DynamicArray(int initcapacity){
        //为避免因容量过小而造成频繁扩容,故容量是否小于默认容量时自动设置为默认容量
        if(initcapacity<DEFAULT_CAPACITY)
            this.capacity = DEFAULT_CAPACITY;
        else
            this.capacity = initcapacity;
        elements = (E[])new Object[capacity];
    }

扩容机制

private void ensureCapacity(int capacity){//即将使用的容量
        int oldCapacity = elements.length;//保存现有容量为旧容量
        if(oldCapacity>=capacity)//容量足够时直接返回
            return;
        int newCapacity = oldCapacity + oldCapacity >> 1;//容量不够时,扩容1.5倍
        E newArray[] = (E[])new Object[newCapacity];//创建一个新数组用来替换旧数组
        for (int i = 0; i < oldCapacity; i++) {
            newArray[i] = elements[i];
        }
        elements = newArray;//将新数组引用赋值给原elements数组
    }

边界检查

private void ofBound(int index){
        if(index<0||index>size)
            throw new IndexOutOfBoundsException("index=" + index + ",size=" + size);
    }

方法实现

public int size(){
    return size;
}
​
public boolean isEmpty(){
    return size == 0;
}
​
public boolean contains(E element){
    return indexOf(element) != ELEMENT_NOT_FOUND;//ELEMENT_NOTFOUND=-1
}
​
public void add(E element){
    add(size, element);
}
​
public E get(int index){
    ofBound(index);
    return elements[index];
}
​
public E set(int index, E element){
    ofBound(index);
    E oldElement = elements[index];
    elements[index] = element;
    return oldElement;
}
​
public void add(int index, E element){
    ensureCapacity(size+1);
    for (int i = size+1; i > index; i--) {
        elements[i] = elements[i-1];
    }
     elements[index] = element;
     size++;
}
​
public E remove(int index){
    ofBound(index);
    E oldElement = elements[index];
        for (int i = index; i < size; i++) {
            elements[i] = elements[i+1];
        }
        size--;
        return oldElement;
}
​
public int indexOf(E element){
    for(int i = 0; i < size; i++){
        if(element.equals(elements[i]))
            return i;
    }
    return ELEMENT_NOT_FOUND;
}
​
public void clear(){
    return size = 0;
}