java动态数组的实现的_动态数组的实现

class="MsoNormal">用到的知识:

1.泛型

?

public class ArrayQueue {}//E表示元素是什么类型,element

2.容量(arr.length)

private int initVolume;

3.增长比率

?

private int GrowthRate;

4.数组长度

?

?

private int length=0;

目的:用动态数组实现增加元素,插入元素,移除元素,修改元素等操作

Object[] src=new Object[0];

add思路:在已知数组最末尾增加元素,先建立新的数组,并初始化容量为旧数组+1,将旧数组拷贝到新数组,新元素增加到末尾,用新数组替换旧数组

实现:

public void add(E s){

//定义一个新数组,用来装数据,长度比src+1

Object []dest =new Object[src.length+1];

//将新加进的元素放入新数组的最后一个下标位置

dest[dest.length-1]=s;

//将原来数组中的数据按照下标顺序拷贝到新数组

for(int i=0;i

dest[i] = src[i];

}

//将src指向新数组

src = dest;

}

?insert思路:和add类似,将旧数组分为两个部分,一部分拷贝到新数组,将插入的元素放到指定位置,再拷贝剩余部分到新数组

实现:

/**

* 将指定元素插入到指定位置

* @param index 要插入元素的位置,第index个元素

* @param s 要插入的新元素

*/

public void insert(int index, E s) {

//定义一个新数组,用来装数据,长度比src+1

Object []dest =new Object[src.length+1];

if(index>=0&&index

//将原来数组中的数据按照下标顺序拷贝到新数组

for(int i=0;i

dest[i] = src[i];

}

for(int i=index;i

dest[i+1] = src[i];

}

//将新加进的元素放入新数组的相应位置

dest[index]=s;

//将src指向新数组

src = dest;

}

else{

System.out.println("插入操作指定下标超出范围,请插入元素到0-"+(src.length-1)+"的位置");

}

}

?

移除操作:思路和插入差不多

/**

* 移除指定位置的元素

* @param index

* 要移除的元素的下标,0-src.length-1;

*/

public void remove(int index) {

//定义一个新数组,用来装数据,长度比src+1

Object []dest =new Object[src.length-1];

if(index>=0&&index

//将原来数组中的数据按照下标顺序拷贝到新数组

for(int i=0;i

dest[i] = src[i];

}

for(int i=index;i

dest[i] = src[i+1];

}

//将src指向新数组

src = dest;

}

else{

System.out.println("caozuo.html" target="_blank">删除操作指定下标超出范围,请删除从0-"+(src.length-1)+"的元素");

}

}

?

上述程序每增加一个数据都得重新分配空间,改进后程序如下:

public class ArrayQueue {//E表示元素是什么类型,element

private int initVolume;

private int GrowthRate;

private int length=0;

Object[] src;

public ArrayQueue(){

this.initVolume=900000;

this.GrowthRate=10000;

src=new Object[initVolume];

}

/**

* 将指定的元素加入容器

* @param s 要加入到容器中的元素

*/

public void add(E s){

if(length==src.length){

Object []dest =new Object[src.length+GrowthRate];

//将原来数组中的数据按照下标顺序拷贝到新数组

//for(int i=0;i

//dest[i] = src[i];

//}

System.arraycopy(src, 0, dest, 0, length);

//将src指向新数组

src = dest;

}

src[length]=s;

length++;

}

/**

* 获取指定下标位置的元素

*

* @param index

* 要获取的元素的下标

* @return 返回获取到的元素

*/

public E get(int index){

return (E)src[index];

}

/**

* 修改指定位置元素的值

*

* @param index要修改的元素位置

* @param s

* 修改后的新元素

*/

public void update(int index, E s) {

if(index>=0&&index

src[index]=s;

}else{

System.out.println("更新操作指定下标超出范围,请更新从0-"+(src.length-1)+"的元素");

}

}

/**

* 将指定元素插入到指定位置

* @param index 要插入元素的位置,第index个元素

* @param s 要插入的新元素

*/

public void insert(int index, E s) {

if(index>=0&&index

Object[] dest;

if(length>=src.length-1){//即将超出范围就需要增加容量

dest =new Object[src.length+GrowthRate];

}else{

dest =new Object[src.length];//至少还差一个超出范围,不需要增加容量

}

//将原来数组中的数据按照下标顺序拷贝到新数组

System.arraycopy(src, 0, dest, 0, index);

System.arraycopy(src, index, dest, index+1,src.length-index-1);

//将src指向新数组

src = dest;

//将新加进的元素放入新数组的相应位置

src[index]=s;

length++;

}

else{

System.out.println("插入操作指定下标超出范围,请插入元素到0-"+(src.length-1)+"的位置");

}

}

/**

* 移除指定位置的元素

*

* @param index

* 要移除的元素的下标,0-src.length-1;

*/

public void remove(int index) {

if(index>=0&&index

Object[] dest;

if(length>=src.length-1){//即将超出范围就需要增加容量

dest =new Object[src.length+GrowthRate];

}else{

dest =new Object[src.length];//至少还差一个超出范围,不需要增加容量

}

//将原来数组中的数据按照下标顺序拷贝到新数组

System.arraycopy(src, 0, dest, 0, index);

System.arraycopy(src, index+1, dest, index,src.length-index-1);

//将src指向新数组

src = dest;

length--;

}

else{

System.out.println("删除操作指定下标超出范围,请删除从0-"+(src.length-1)+"的元素");

}

}

/**

* 获得容器中元素个数的方法

*

* @return 返回元素的个数

*/

public int size() {

return length;

}

}

?

public class Demo {

public static void main(String args[]){

ArrayQueue queue =new ArrayQueue();

long t1=System.currentTimeMillis();

for(int i=0;i<1000000;i++){

queue.add(""+i);

}

long t2=System.currentTimeMillis();

for(int i=0;i

System.out.println(queue.get(i));

}

System.out.println(t2-t1);

/**测试不同容量.增长比率对时间的影响

* this.initVolume=900000;

*this.GrowthRate=10000;

*t2-t1=891

*this.initVolume=9000;

*this.GrowthRate=100;

*t2-t1=7792

*/

}

}

?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的数组是一种线性数据结构,它由相同类型的元素组成并按照顺序存储在内存中。Java中的数组可以使用new关键字动态地创建,并且长度是固定的,一旦创建后就不能再改变它的大小。 Java中的ArrayList是一个动态数组,它可以自动扩容以适应元素的添加和删除。ArrayList实际上是基于数组实现的,它内部维护了一个Object类型的数组来存储元素。当ArrayList的容量不足时,它会根据一定的策略自动扩容数组的大小,以容纳更多的元素。 ArrayList的实现原理主要包括以下几个方面: 1. 初始容量和扩容因子:当创建一个ArrayList时,可以指定一个初始容量和一个扩容因子。初始容量指定了ArrayList内部数组的初始大小,扩容因子指定了数组增长的比例。默认情况下,初始容量为10,扩容因子为1.5。 2. 自动扩容:当ArrayList内部数组的容量不足时,它会自动扩容。具体实现是创建一个新的数组,将原数组中的元素复制到新数组中,并将新元素添加到新数组中。 3. 随机访问:由于ArrayList是基于数组实现的,因此它支持随机访问。可以通过索引来快速访问元素,时间复杂度为O(1)。 4. 插入和删除:在ArrayList中插入和删除元素的时间复杂度取决于操作的位置。如果在末尾插入或删除元素,时间复杂度为O(1),否则需要将后面的元素都向后移动,时间复杂度为O(n)。 总之,ArrayList是Java中常用的动态数组,它的实现基于数组,并且支持随机访问、自动扩容等特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值