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;i size) 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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。