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());
}
我们发现,他给我们进行扩容了,也就是说我们的这个方法成功了!
方法很简单重要的是如何运用和拼凑,怎样去养成自己的构造思维,希望能帮助大家!
热爱生活,热爱代码!