今天学习了动态数组,在老师讲的基础上我自己下去想了点东西,记录一下
这个是例子:
public class SuperArray { // 具体存放数据的数组 public int[] arr; // 表示当前数组中数据的个数 public int size = 0; // 构造方法 public SuperArray() { arr = new int[10]; } /** * 用来存数据 * @param data 存储的数据 */ public void add(int data) { // 该怎么把data放到arr中? arr[size] = data; size++; // 元素个数+1 // 判断数组是否已经满了,如果满了就创建新数组 if(size == arr.length) { modify(); // 更新数组 } } public void modify() { // 创建一个新的数组,长度为远了数组的2倍 int[] newArr = new int[arr.length * 2]; // 将原来数组中的数据复制到新数组中 for (int i = 0; i < arr.length; i++) { newArr[i] = arr[i]; } arr = newArr; } }
这样写的话数组后面有的元素并没有储存数据,打印出来就是0,所以要用size来控制打印的长度
但这样有点麻烦,我就想能不能直接一次性打印出整个数组且没有元素为0
后来我想到了先将数组长度设为1,即arr=new int[1]
然后每次只要在添加新数据的时候将数组长度加一就行了,即把 int[] newArr = new int[arr.length * 2] 改为 int[] newAry=new int[size+1] 就可以了
但输出结果的时候发现后面还是会跟着一个0,我就反思为什么。思考后发现原来是add()方法每次是先添加,再判断。那么改为先判断,再添加不就好了吗
这是修改后的
import java.util.Arrays; public class SuperArray { private int[] ary; private int size=0; public SuperArray(){ ary=new int[1]; } public void add(int date) { if(size==ary.length) { modify(); } ary[size]=date; size++; } private void modify(){ int[] newAry=new int[size+1]; for(int i=0;i<size;i++) { newAry[i]=ary[i]; } ary=newAry; } public int getSize() { return size; } public void getAry() { System.out.println(Arrays.toString(ary)); } }
来测试一下
达到了我想要的效果,添加几个元素数组长度就是几,遍历元素后面也没有空值