Java数组的扩容与缩容

在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");
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值