在java当中我们并不能随意改变原有数组的长度,当数组被new出来并指定长度之后,这个数组的长度就不能再改变了,且数组中的元素在内存中是依次紧密排列的,有序的 。
Java数组的扩容
现有数组 int[] arr = new int[]{1,2,3,4,5}; 现将数组长度扩容1倍,并将10,20,30三个数据添加到arr数组中,如何操作?
我们可以创建一个新的数组,并将数组的长度扩大到原来的一倍,将原有的元素放进去,再放上新增加的元素即可。
public class ArrayExer01 {
public static void main(String[] args) {
//创建现有数组
int[] arr = new int[]{1,2,3,4,5};
//将数组长度扩容1倍
//创建一个新的数组
// int[] newArr = new int[arr.length * 2];
int[] newArr = new int[arr.length << 1];
//将原有的元素放进新的数组中
for (int i = 0; i < arr.length; i++) {
newArr[i] = arr[i];
}
//将需要新增的元素放到newArr数组中
newArr[arr.length] = 10;
newArr[arr.length + 1] = 20;
newArr[arr.length + 2] = 30;
//将新数组的地址值赋给arr
arr = newArr;
//打印数组
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
}
}
其中 << 1左移一位就相当于乘以了2,>> 1右移了一位就相当于除以了2。
Java数组的缩容
现有数组 int[] arr={1,2,3,4,5,6,7}。现需删除数组中索引为4的元素。
我们并不能将需要删除的元素那一个空间直接抛掉,然后后面的连接上,这是做不到的,因为数组是在内存中一个连续的空间,但是我们可以将所删除元素后面的元素覆盖其原有的位置,最后一位补上默认值即可。如下方方式1:
我们也可以创建一个新的数组,其长度减1,将原有数组中除删除的元素之外赋给这个数组。如下方方式2:
其中,我们可以分为两段,删除元素索引之前为一段,之后为一段。所以我们可以分别赋值。
也可以在遍历原数组时,continue掉,跳出索引为删除元素索引的那一次循环。这样也可以完成赋值。
public class ArrayExer02 {
public static void main(String[] args) {
int[] arr={1,2,3,4,5,6,7};
int deleteIndex = 4;
//方式1:不创建新的数组
// for (int i = deleteIndex; i < arr.length - 1; i++) {
// arr[i] = arr[i + 1];
// }
// //将数组最后一个元素赋上默认值
// arr[arr.length - 1] = 0;
//方式2:创建新的数组
int[] newArr = new int[arr.length - 1];
//方式2.1
/*for (int i = 0; i < deleteIndex; i++) {
newArr[i] = arr[i];
}
for (int i = deleteIndex; i < arr.length - 1;i++){
newArr[i] = arr[i + 1];
}*/
//方式2.2
for (int i = 0, j = 0; i < arr.length; i++) {
if (i == deleteIndex) {
continue; // 跳过删除的元素
}
newArr[j++] = arr[i]; // 将非删除元素添加到新数组
}
arr = newArr;
//打印数组
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
}
}