动态数组的实现案例
Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是List。下面介绍一下List作为Java动态数组的用法。
我们可以首先编写两个类List.java 和一个测试类Test1.java。将主类和测试类分开写,更有利于扩展性,这是一个非常好的编程思想。下面来看一下我们如何来实现List类。注释已经写得很清楚了,如果有不懂的地方欢迎留言。
//定义一个容器类 public class List{ final int INIT_LENGTH=10; int[] array=new int[INIT_LENGTH]; int index=-1; int add(int [] newArray){ int temp=index; if(newArray==null){ System.out.println("数组不能为空"); return -1; } if(index+1+newArray.length>array.length){ int newlength=(index+1+newArray.length)*2; expand(newlength); } System.arraycopy(newArray,0,array,index+1,newArray.length); index=index+newArray.length; return temp+1; } //方法的重载 void expand(int newlength){ //新创建一个数组,这个新数组的长度两倍大 int[] x=new int[newlength]; //复制array中的数据到x中 System.arraycopy(array,0,x,0,array.length); array=x; } void expand(){ //新创建一个数组,这个新数组的长度两倍大 int[] x=new int[array.length*2]; //复制array中的数据到x中 System.arraycopy(array,0,x,0,array.length); array=x; } //输出指定位置的元素 int remove(int i){ //判断i是否存在 if(i>=0&&i<index){ System.arraycopy(array,i+1,array,i,index-i); index--; }else{ System.out.println("集合中没有这个索引"+i); return -1; } return -1; } //添加元素到指定位置 //value:要添加的值 //i:添加到数组的位置 //返回值:添加元素的索引 int add(int value,int i){ if(i<0||i>index+1){ System.out.println("索引越界"+i); return -1; } if(index>=array.length-1){ expand(); } index++; System.arraycopy(array,i,array,i+1,index-i); array[i]=value; return i; } //清空 void clear(){ array=new int[INIT_LENGTH]; index=-1; } //求出容器的真实大小 int size(){ return index+1; } void add(int value){ if( index>=array.length-1){ expand(); } index++; array[index]=value; } int[] getArray(){ //新创建一个数组 int[] result=new int[index+1]; System.arraycopy(array,0,result,0,index+1); return result; } }
接下来,我们把测试类写好。
public class Test1{ public static void main(String[] args){ List list=new List(); int[] r=list.getArray(); for(int t:r){ System.out.println(t); } //开始存元素 list.add(1); list.add(2); r=list.getArray(); for(int t:r){ System.out.println(t); } System.out.println("list容器中有"+list.size()); for(int i=0;i<10;i++){ list.add(i); } //存完后 r=list.getArray(); for(int t:r){ System.out.println(t); } System.out.println("list容器中有"+list.size()); System.out.println("清空==================="); list.clear(); System.out.println("清空后,list容器中有"+list.size()); System.out.println("移除==================="); for(int i=0;i<10;i++){ list.add(i); } list.remove(3); r=list.getArray(); for(int t:r){ System.out.println(t); } System.out.println("在指定位置添加元素"); list.add(888,1000); r=list.getArray(); } }然后呢,我们使用javac Test1.java
java Test1
就可以顺利编译运行了。