利用基础自己做一个可以无限存放数据的数组

HELLO

今天我们利用最底层的数组来做一个假设可以无限存放数据的工具,首先我们要理解为什么要这样做,大家都知道普通数组长度是固定的,如果你的数据超过了它的长度,那么就会出现下标越界的情况,所以我们要做一个工具,只需要给数据我们就可以将它存起,而不会出现没有空间的问题,接下来就开始展示:

首先第一步我们创建一个类,然后写一个方法就叫做存入方法吧,在这个方法中我们需要一个真实的数组用来存放我们的数据,然后里面还需要一个方法来进行判断,判断是否每个数据都有空间进行存储:

 

 我们将这个判断方法提取出来,首先我们要假设一个最小的容量,然后跟原数组的容量进行对比,如果这个最小容量小于原有容量那就不做改变,如果大于原有容量,那我们就需要扩容,下面是我们的判断方法:

    private void ensureCapacityInternal(int minCapacity){
        //判断需要的最小容量,跟现在的element数组的容量比
      if (minCapacity > element.length){
            addsprce(minCapacity);
      }

    }

这个addsprce是我们的扩容方法,我们将它也提取出来,具体是这样写的,首先我们需要获取老数组的长度,然后用老数组的长度右移1位,也就是除于二我们来进行扩容,然后得到新的数组,那如果新的空间小于最小空间怎么办呢,我们就将最小空间的值连带着付给我们的新空间:

 //经过计算,如果长度不够用创建新数组要多长
    private void addsprce(int minCapacity){
        int oldelement = element.length;

        int newCapacity = oldelement + (oldelement >> 1);

        if (newCapacity < minCapacity){
            newCapacity = minCapacity;
        }

        element= copyOf(element,newCapacity);
    }

有了这个新空间之后我们就需要去进行数组的扩容了,我们需要带着原先数组里的数据,和我们新的空间来进行替换,首先我们将我们计算出的新空间用来创建一个新的数组,然后将旧数组内的元素挨个访问一遍,并且取出放入新数组的对应位置,然后返回这个新数组:

 private int[] copyOf(int[] oldArray,int newCapacity){
        //1.根据计算出来的新的长度,去创建新数组
        int[] newArray =new int[newCapacity];
        //2.将旧数组内的元素挨个访问一遍,取出来放入新数组的对应位置
        for (int i = 0; i < oldArray.length; i++) {
            newArray[i]=oldArray[i];
        }
        return newArray;
    }

接下来我们就可以进行测试了,我们需要看到数组的长度和数组的实际下标,现在我给他默认长度是49,然后我存入49个数据去进行测试:

 public static void main(String[] args) {
        TempDemo tempDemo = new TempDemo();
        for (int i = 0; i < 49; i++) {
            tempDemo.add(4);
        }

        System.out.println(tempDemo.size());
        System.out.println(tempDemo.length());
    }

 我们可以发现长度未发生改变,正好存入四九个数据,接下来我们存入55个数据进行测试,看是否会出现下标越界:

    public static void main(String[] args) {
        TempDemo tempDemo = new TempDemo();
        for (int i = 0; i < 55; i++) {
            tempDemo.add(4);
        }

        System.out.println(tempDemo.size());
        System.out.println(tempDemo.length());
    }

我们发现,他给我们进行扩容了,也就是说我们的这个方法成功了!

 

方法很简单重要的是如何运用和拼凑,怎样去养成自己的构造思维,希望能帮助大家!

热爱生活,热爱代码!

猜你喜欢

转载自blog.csdn.net/m0_67864787/article/details/127978177
今日推荐