Java封装数组之动态数组实现方法详解
本文实例讲述了Java封装数组之动态数组实现方法。分享给大家供大家参考,具体如下:
前言:在此之前,我们封装的数组属于静态数组,也即数组空间固定长度,对于固定长度的数组当元素超过容量时会报数组空间不足。为了能更好的使用数组,我们来实现一个可以自动扩充容量的数组。
实现思路:
1.当数组容量达到事先定义值时创建一个空间是data数组两倍的newData数组(扩容);
2.把data数组中的元素全部赋值到newData数组中;
3.把data数组重新执行newData数组。
一、定义核心扩容方法
//数组扩容
privatevoidresize(intnewCapacity){
E[]newData=(E[])newObject[newCapacity];
for(inti=0;i
二、改进之前的数组添加元素方法(数组空间不够时自动扩容--原理空间的2倍)
//在第index个位置插入一个新元素
publicvoidadd(intindex,Ee){
//(1)判断当前需要插入值的位置是否合理,合理则转入(3),否则抛出位置不合法异常
if(index<0||index>size)
thrownewIllegalArgumentException("您选择的位置不合法");
//(2)先判断当前数组容量是否已满,满则进行容量扩充
if(size==data.length)
resize(data.length*2);
//将index位置之后的元素往后依次移动一位
for(inti=size-1;i>=index;i--){
//(3)将index之后的元素依次往后移动一位,然后将新元素插入到index位置
data[i+1]=data[i];
}
data[index]=e;
//(4)维护size值
size++;
}
三、改进之前的数组删除元素方法(数组空间空闲太大就会缩容(原来空间的1/2))
//从数组中删除index位置的元素,返回删除的元素
publicEremove(intindex){
//1.判断索引的选择是否合法
if(index<0||index>size)
thrownewIllegalArgumentException("您选择的位置不合法");
//2.先存储需要删除的索引对应的值
Eret=data[index];
//将索引为index之后(index)的元素依次向前移动
for(inti=index+1;i
通过以上,我们就可以实现一个动态的数组。
测试一下改进后的代码:
1.测试addLast()
DynamicArrayarr=newDynamicArray(10);
for(inti=0;i<10;i++){
arr.addLast(i);
}
System.out.println("添加数组元素:");
System.out.println(arr);
结果为:
2.测试add(intindex,Ee)方法
arr.add(1,100);
System.out.println("在数组指定索引位置插入元素e:");
System.out.println(arr);
结果:
现在数组已经从刚才定义的容量为10个变为了容量为20个,数组中元素为11个,为此实现了数组扩容。
3.测试removeLast方法
System.out.println("删除数组最后一个元素:");
arr.removeLast();
System.out.println(arr);
结果为:
此时我们可以看出,删除一个元素之后,数组容量又从新变为了10个。
本节所有代码:
/**
*3.动态数组
*数组容量可变
*/
publicclassDynamicArray{
//使用private的目的是防止用户从外界修改,造成数据不一致
privateE[]data;
privateintsize;//数组中元素个数
//构造函数,传入数组的容量capacity构造Array函数
publicDynamicArray(intcapacity){
data=(E[])newObject[capacity];//泛型不能直接实例化
size=0;
}
//无参构造函数,默认数组的容量capacity=10
publicDynamicArray(){
this(10);
}
//获取数组中元素个数
publicintgetSize(){
returnsize;
}
//获取数组的容量
publicintgetCapacity(){
returndata.length;
}
//获取数据是否为空
publicbooleaniEmpty(){
returnsize==0;
}
//向所有元素后添加元素
publicvoidaddLast(Ee){
add(size,e);//size表示此时的最后一个元素
}
//在所有元素之前添加一个新元素
publicvoidaddFirst(Ee){
add(0,e);//0表示第一个位置
}
//在第index个位置插入一个新元素
publicvoidadd(intindex,Ee){
//(1)判断当前需要插入值的位置是否合理,合理则转入(3),否则抛出位置不合法异常
if(index<0||index>size)
thrownewIllegalArgumentException("您选择的位置不合法");
//(2)先判断当前数组容量是否已满,满则进行容量扩充
if(size==data.length)
resize(data.length*2);
//将index位置之后的元素往后依次移动一位
for(inti=size-1;i>=index;i--){
//(3)将index之后的元素依次往后移动一位,然后将新元素插入到index位置
data[i+1]=data[i];
}
data[index]=e;
//(4)维护size值
size++;
}
//获取index索引位置的元素
publicEget(intindex){
//(1)判断当前需要插入值的位置是否合理,合理则转入(2),否则抛出位置不合法异常
if(index<0||index>size)
thrownewIllegalArgumentException("您选择的位置不合法");
//(2)返回索引index对应的值
returndata[index];
}
//获取最后一个元素
publicEgetLast(){
returnget(size-1);
}
//获取第一个元素
publicEgetFirst(){
returnget(0);
}
//修改index索引位置的元素为e
voidset(intindex,Ee){
//(1)判断当前需要插入值的位置是否合理,合理则转入(2),否则抛出位置不合法异常
if(index<0||index>size)
thrownewIllegalArgumentException("您选择的位置不合法");
//(2)修改索引index对应的值
data[index]=e;
}
//查找数组中是否包含元素e
publicbooleancontains(Ee){
for(inti=0;isize)
thrownewIllegalArgumentException("您选择的位置不合法");
//2.先存储需要删除的索引对应的值
Eret=data[index];
//将索引为index之后(index)的元素依次向前移动
for(inti=index+1;i
测试代码:
publicclasstest{
publicstaticvoidmain(String[]args){
DynamicArrayarr=newDynamicArray(10);
for(inti=0;i<10;i++){
arr.addLast(i);
}
System.out.println("添加数组元素:");
System.out.println(arr);
arr.add(1,100);
System.out.println("在数组指定索引位置插入元素e:");
System.out.println(arr);
System.out.println("删除数组最后一个元素:");
arr.removeLast();
System.out.println(arr);
}
}
更多关于java相关内容感兴趣的读者可查看本站专题:《Java数组操作技巧总结》、《Java字符与字符串操作技巧总结》、《Java数学运算技巧总结》、《Java数据结构与算法教程》及《Java操作DOM节点技巧总结》
希望本文所述对大家java程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。