(JDK源码经常碰到,比如容器的拷贝底层全是数组的拷贝)
概念描述
System类里包含一个static void arraycopy(object src, int srcpos, object dest, int destpos, int length)方法
该方法可以将sec数组里的元素赋值给dest数组的元素
srcpos指定从src数组的第几个元素开始赋值
length参数指定将src数组的多少个元素赋给dest数组的元素
数组拷贝:
public class Test{
public static void main(String[] args){
String[] s = {"阿里","百度","头条","京东","虾皮"};
String[] sBak = new String[6];
System.arraycopy(s,0,sBak,0,s.length);
for(int i = 0; i < sBak.length; i++){
System.out.println(sBak[i] + "\t");
}
}
}
arraycopy源码:
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
说明:
-
native是本地的意思,调用本地方法---C语言写出来的,底层是C语言
-
src指源数组---以那个为基础
-
dest指目标数组---复制到哪去
-
srcPos指从哪开始---第几个数组索引值开始
-
destPos(目标数组不一定要和源数组索引一致)---指的是希望放到目标数组的索引位置
-
比如说我想把源数组的0号索引值放到目标数组的1号索引处,destPos的值是0---起始位置
-
-
length指的是从源数组开始copy的位置开始拷贝几个数---1、2、3个
源数组与目标数组不一样的copy:
/*基本测试*/
public static void testBasicCopy(){
/*源数组是字符串数组*/
String[] s1 = {"aa","bb","cc","dd","ee"};
/*定义一个目标数组,开辟空间不赋值*/
String[] s2 = new String[10];
/*从s1拷贝到s2,拷贝cc和dd*/
/*
2号索引
3个
*/
System.arraycopy(s1,2,s2,6,3); //native本地方法,c语言写出来的内容
/*遍历打印数组内容*/
for (int i = 0; i <= s2.length; i++){
System.out.println(i + "--" + s2[i]);
}
/*Arrays.toString方法打印*/
System.out.printf(Arrays.toString(s2));
}
源数组与目标数组一致,并且封装方法---很重要
package com.array;
import java.util.Arrays;
/**
* 测试数组的拷贝
* @author Lucifer
*/
public class TestArrayCopy {
public static void main(String[] args) {
// testBasicCopy2();
/*定义一个数组,调用封装的方法*/
String[] str = {"Alibaba","Bytedance","Tencent","Baidu"};
/*调用removeElement删除元素*/
removeElement(str,3);
}
/*基本测试*/
public static void testBasicCopy(){
/*源数组是字符串数组*/
String[] s1 = {"aa","bb","cc","dd","ee"};
/*定义一个目标数组,开辟空间不赋值*/
String[] s2 = new String[10];
/*从s1拷贝到s2,拷贝cc和dd*/
/*
2号索引
3个
*/
System.arraycopy(s1,2,s2,6,3); //native本地方法,c语言写出来的内容
/*遍历打印数组内容*/
for (int i = 0; i <= s2.length; i++){
System.out.println(i + "--" + s2[i]);
}
// /*Arrays.toString方法打印*/
// System.out.printf(Arrays.toString(s2));
}
/*测试从数组中删除某个元素(其本质还是数组的拷贝)*/
//删除数组中指定索引位置的元素,并将原数组返回
public static void testBasicCopy2(){
/*
删掉cc让dd和ee补到前面去
拷贝的时候不拷贝cc了
从s1的3号索引开始拷贝
从s1的2号索引开始放
从3开始拷贝的长度是s1的长度-1个数
*/
String[] s1 = {"aa","bb","cc","dd","ee"};
// String[] s2 = new String[5];
System.arraycopy(s1,3,s1,3-1,s1.length-3);
/*
srcPos是从3号索引开始拷贝
destPos是放到2号索引的位置---只是复制过去
d、e覆盖了c和d,因为最后一位e没有删除,所以还会输出最后一个e
所以要将最后一位制空
所以删某个元素就是要从删除的元素开始往后全部拷贝一遍,然后制空最后一位如果数组数量多了效率就很低
所以数组的读取效率高,删减效率低
*/
/*将数组最后一位置空*/
//所以数组的拷贝本质上就是数组的拷贝
s1[s1.length - 1] = null;
/*遍历打印数组内容*/
for (int i = 0; i <= s1.length; i++){
System.out.println(i + "--" + s1[