扩容简介
大家都清楚,数组一旦创建初始化后,其长度就不能被改变。但是有的小伙伴就说了,”不对啊,我看别人的文章说,可以往数组中增加很多新数据啊......“。那如果是这样,假如我们一开始定义一个长度为5的数组,然后想把10个数据元素都插进去,这能不能实现?
大家想一下,你能把10升水装到5升的瓶子中吗?肯定不行!如果你非要把10升水都装到瓶子里,肯定需要换一个新的更大的瓶子!
所以今天壹哥跟大家说的”数组扩容“,其实并不是将这些多余的数据装到原有的数组中,而是创建一个新的更大的数组,再把原有数组中的内容都复制到新数组中来!
扩容与缩容流程(重点)
在Java中,数组的”扩容“和”缩容“,并不是真的改变原有数组的大小,而是创建一个新的数组,然后再进行操作,具体流程如下:
●步骤1:定义一个新数组,新数组的长度要比原数组增加或者减小;
●步骤2:将原数组中的元素拷贝到新数组中;
●步骤3:将原数组的名称变量指向新数组。
代码实现
接下来带大家实现一下数组的扩容和缩容。
public class Demo05 {
public static void main(String[] args) {
// 数组扩容
// 原数组
int[] oldArr = { 1, 3, 46, 22, 11 };
// 1.定义一个新数组,长度比原数组的长度多1,用于扩容
int[] newArr = new int[oldArr.length + 1];
// 2.数组拷贝
for (int i = 0; i < oldArr.length; i++) {
//数组拷贝,将原来数组的元素拷贝到新数组中
newArr[i] = oldArr[i];
}
// 3.将原数组的名称变量指向新数组
oldArr = newArr;
System.out.println("数组长度="+oldArr.length);
//遍历数组
for (int i = 0; i < oldArr.length; i++) {
//最后一个元素的值是默认值0
System.out.println(oldArr[i]);
}
}
}
这里我们使用newArr[i] = oldArr[i];这样的语句,将旧数组中的元素拷贝到新数组中
3.2 缩容代码
以下代码是进行数组缩容的案例,供大家参考:
public class Demo06 {
public static void main(String[] args) {
// 数组缩容
//定义一个原数组
int[] oldArr = {1,3,46,22,11};
//1.定义一个新数组,新数组的长度比原数组长度少1个
int[] newArr = new int[oldArr.length-1];
//2.进行数组拷贝,将旧数组中的元素拷贝到新数组中
for (int i = 0; i < newArr.length; i++) {
newArr[i] = oldArr[i];
}
//3.将原数组的名称变量指向新数组
oldArr = newArr;
for (int i = 0; i < newArr.length; i++) {
System.out.println(oldArr[i]);
}
}
}
接下来大家看看这个这个问题:Java 中 ArrayList 自动扩容的内存上的具体过程是怎样的?
在 Java 中,ArrayList 是一种可变长度的数组结构,它可以自动扩容以适应添加更多元素的需求。当我们向 ArrayList 中添加元素时,如果当前容量不足,ArrayList 会自动扩容来提供更多的内存。
具体而言,ArrayList 会创建一个新的数组,其大小通常是当前数组大小的两倍,然后将原始数组中的元素复制到新数组中。这个过程被称为“重新分配底层数组”,它涉及到以下步骤:
1.当 ArrayList 内部的数组容量不足时,ArrayList 将创建一个新的数组,其大小通常是当前数组大小的两倍。
2.ArrayList 将原始数组中的元素复制到新数组中。这个过程可以使用 System.arraycopy() 方法来完成,这个方法会快速地将原始数组中的元素复制到新数组中。
3.ArrayList 将新数组设置为其内部数组,丢弃旧数组,并更新其容量,以便能够容纳更多的元素。
这个过程需要一些时间和空间开销,因此我们应该尽可能地预测我们需要存储的元素数量,并在创建 ArrayList 时指定初始容量。这样可以避免不必要的重新分配底层数组操作,并提高 ArrayList 的性能。