java向量为什么不会自动扩容_Java 基于数组自定义实现容量可变向量Vector

数组容量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)策略。就像蝉一样,每当生长到足够大时,就会蜕去原来的外壳,换上一身更大的外壳。具体过程如 图 所示。 不必担心原先的数组,它占用的空间将被内存回收器自动回收。

0818b9ca8b590ca3270a3433284dd417.png

代码实现:

@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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值