数组容量N固定。一方面,在向量规模很小时,预留这么多的空间实属浪费;反过来,当向量规模超过N时,即使系统有足够的空间资源,也会因
意外错而崩溃。幸好,有一个简易的方法可以克服这一缺陷。我们希望向量能够根据实际需要,动态地扩充数组的容量。当然, Java 语言本身并不支持这一功能,与多数程序语言一样, Java 中数组的容量都是固定的。我们的策略是,一旦数组空间溢出(即size≥CAPACITY), insertAtRank()方法就会做如下处理:
开辟一个容量为2N的新数组arrayNew
将array[]中各元素搬迁至arrayNew[],即arrayNew[i]=array[i], i=0, …, N-1
将array替换为arrayNew,即令array=arrayNew
此后, insertAtRank()就可以将新元素插入至扩容后的数组了。
实际上,这就是所谓的可扩充数组( Extendable arra y)策略。就像蝉一样,每当生长到足够大时,就会蜕去原来的外壳,换上一身更大的外壳。具体过程如 图 所示。 不必担心原先的数组,它占用的空间将被内存回收器自动回收。
代码实现:
@Override
public void insertAtRank(int position, Object element) throws ExceptionBoundaryExceed{
if(position < 0 || position > size)
throw new ExceptionBoundaryExceed("Vector exceed! ");
if(position >= CAPACITY){//Deal with overflow
CAPACITY *= 2;
Object[] arrayNew = new Object[CAPACITY];
for(int i = 0;i < array.length;i ++)
arrayNew[i] = array[i];
array = arrayNew;
}
for(int i = size;i > position;i --)
array[i] = array[i - 1];
array[position] = element;
size ++;
System.out.println("Element you insert is: " + element + " at position: " + position);
}
该程序基于Java 基于数组自定义实现容量不可变向量Vector实现,其他的源码都一样, 上述代码是VectorBasicOnArray类,insertAtRank方法的修改版。
相关文字借鉴引用 数据结构与算法( Java 描述)邓俊辉 著
源码在github上:https://github.com/gannyee/JavaDataStruct