1. 数组扩容
问题: 现有数组 int[] arr = new int[]{1,2,3,4,5,6};
,现将数组长度扩容1倍,并将7,8,9
三个数据添加到arr数组中。
思路:
- 新建一个数组长度为arr的两倍
- 将arr的值复制到新数组
- 再新数组尾部追加数据
- 将新数组的指针指向arr
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5,6};
// 1. 新建一个数组长度为arr的两倍
// int[] arr2 = new int[arr.length * 2];
// 或 <<1 也表示乘以2,>>1表示除以2
int[] arr2 = new int[arr.length << 1];
// 注意终止条件
for (int i = 0; i < arr.length; i ) {
// 2. 将arr的值复制到新数组
arr2[i] = arr[i];
}
// 3. 再新数组尾部追加数据
arr2[arr.length] = 7;
arr2[arr.length 1] = 8;
arr2[arr.length 2] = 9;
// 3.将arr2的指针指向arr,arr2会被垃圾回收期回收
arr = arr2;
//输出:1,2,3,4,5,6,7,8,9,0,0,0
}
}
2. 数组缩容
问题: 现有数组 int[] arr={1,2,3,4,5,6,7}
。现需删除数组中索引为4
的元素。
方案1(推荐):不创建新数组
思路: 将值前移,最后一位,置为数组默认值
。不创建新数组
public static void main(String[] args) {
// 删除4
int[] arr = new int[]{1,2,3,4,5,6,7};
// 方案1:将值前移,最后一位,置为数组默认值。不创建新数组
int deleteIndex = 3;
//注意终止条件
for (int i = deleteIndex; i < arr.length -1; i ) {
arr[i] = arr[i 1];
}
// 最后一位,置为int默认值0
arr[arr.length-1]=0;
//输出:1,2,3,5,6,7,0
}
方案2:创建新数组
- 删掉4
- 创建一个长度为原数组长度 -1 的新数组
- 将数组复制到一个新数组
- 再将新数组指针只回原数组
一个for循环 if 条件
代码语言:javascript复制public static void main(String[] args) {
//方案2:删掉数据,将数组复制到一个新数组。创建新数组
int[] arr1 = new int[]{1,2,3,4,5,6,7};
int[] arr2 = new int[arr1.length - 1];
for (int i = 0; i < arr1.length-1; i ) {
// // deleteIndex = 4 的时候不会复制
if (i != deleteIndex) {
// deleteIndex < 4 走这里
arr2[i] = arr1[i];
}
// deleteIndex > 4 走这里
arr2[i]=arr[i];
}
// 将指针指回arr,arr1会被垃圾回收器回收
arr1 = arr2;
//输出:1,2,3,5,6,7
}
两个for循环实现
代码语言:javascript复制public static void main(String[] args){
int[] arr = new int[]{1,2,3,4,5,6,7};
int[] arr1 = new int[arr.length - 1];
int deleteIndex = 3;
for(int i = 0; i < deleteIndex; i ){
arr1[i] = arr[i 1];
}
for(int i = deleteIndex; i < arr.length - 1; i ){
arr1[i] = arr[i];
}
// 将指针指回arr,arr1会被垃圾回收器回收
arr = arr1;
//输出:1,2,3,5,6,7
}