今天学习了动态数组,在老师讲的基础上我自己下去想了点东西,记录一下

这个是例子:

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));
    }
}

来测试一下

 达到了我想要的效果,添加几个元素数组长度就是几,遍历元素后面也没有空值

01-15 06:15
查看更多