一、数组的拷贝:
从一个数组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");
测试结果