我的 Java学习笔记(17):数组的拷贝&插入和删除元素的本质&数组扩容操作

一、数组的拷贝:

在这里插入图片描述

从一个数组src拷贝到另一个数组dest,从src的srcPos位置开始拷贝,拷贝到dest的destPos位置,length指的是拷贝的部分的长度。

 public static void testcopy(){
       String[] s1= {"aa","bb","cc","dd","ee"};
       String[] s2= new String[10];
       
       System.arraycopy(s1, 2, s2, 6, 2);
       //从src的srcPos位置开始,拷贝length个长度的元素到目标数组dest数组的destPos位置
       for(int i=0;i<s2.length;++i) {
            System.out.println(s2[i]);
       }
 }

输出的结果是:

在这里插入图片描述

 public static void testcopy2(){
       String[] s1= {"aa","bb","cc","dd","ee"};
       String[] s2= new String[5];
       
       System.arraycopy(s1, 3, s2, 2, s1.length-3);
       //从src的srcPos位置开始,拷贝length个长度的元素到目标数组dest数组的destPos位置
       for(int i=0;i<s2.length;++i) {
            System.out.println(s2[i]);
       }
 }

从5个元素的s1数组的第3个位置开始拷贝两个元素到一样长度的s2数组,就相当于删除了其他三个元素。

在这里插入图片描述

二、数组的删除和插入元素:

因此删除数组自己的元素,就可以用拷贝的方式从自己数组本身拷贝自己到自己:

把上面的代码的s2改成s1:

 public static void testcopy3(){
       String[] s1= {"aa","bb","cc","dd","ee"};
       //String[] s2= new String[5];
       System.arraycopy(s1, 3, s1, 2, s1.length-3);
       //从src的srcPos位置开始,拷贝length个长度的元素到目标数组dest数组的destPos位置
       for(int i=0;i<s1.length;++i) {
            System.out.println(s1[i]);
       }
 }

运行结果是:

在这里插入图片描述

过程是这样的,从位置3(s1[3])开始拷贝两个元素,dd和ee复制到s1的位置5-3=2(s1[2])开始,那么原来cc和dd的位置就会被dd和ee覆盖,而原来的ee位置还是ee。

我们也可以把最后一个元素置空。

所以我们可以把这个方法封装成一个删除数组某个指定位置元素后再返回的方法:

 public static String[] removeEle(String[] str,int index) {
       
       System.arraycopy(str, index, str, index-1,  str.length-index);
       str[str.length-1]=null;
       
       for(int i=0;i<str.length;++i) {
            System.out.println(i+"-->"+str[i]);
       }
       return str;
 }

调用方法:

       String[] str=  {"first","second","third","fourth","fifth"};
       removeEle(str,3);//删除这个数组的第三个元素并返回

输出结果如下:(在方法体里不输出也可以,因为返回了数组,可以在测试的时候进行输出)

在这里插入图片描述

同理,也可以在指定位置插入元素:

但是和删除不同的是,数组的长度本身是固定的,那么插入元素之后,就涉及到数组的扩容问题。

数组的扩容本质上就是,先定义一个更大的数组,然后将原数组的内容原封不动的拷贝到新数组中来,这样就达到了扩容的目的。

 public static void extendRange() {
       String[] s1= {"aa","bb","cc"};
       String[] s2=new String[s1.length+10];
       
       System.arraycopy(s1, 0, s2, 0, s1.length);
       for(String temp:s2) {
            System.out.println(temp);
       }
 }

可以看到结果:

在这里插入图片描述

那么一样,我们进行封装之后就可以再得到插入元素的功能:

 public static String[] addElement(String[] s,int  index,String s1) {
       //"first","second","third","fourth","fifth"};str,3,"hello";第3个位置插入hello,那么index是3,s1是hello
       String[] sCopy=new String[s.length+1];//插入一个元素,所以返回数组的长度加一
       
       System.arraycopy(s, 0, sCopy, 0, index-1);
       //把s的从0开始的3-1的两个元素拷贝到sCopy的前两个元素,因为要在第3个位置插入hello
       sCopy[index-1]=s1;
       //在index-1也就是第三个位置插入要插入的元素
       System.arraycopy(s, index-1, sCopy, index,  s.length-index+1);
       //从s的第index-1的位置开始,拷贝过去本来剩下的length-index个元素,这里是从原来的数组下标2开始复制剩下的3个元素到sCopy
       for(String temp:sCopy) {
            System.out.println(temp);
       }
       return sCopy;
 }

我们测试他看看:

       String[] str=  {"first","second","third","fourth","fifth"};
       addElement(str,3,"hello");

测试结果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值