@Test
void test4(){
/*源数组*/
byte[] bys = {11,22,33};
/*目标数组*/
byte[] bys2 = new byte[bys.length];
/*通常将一个数组的元素复制到另一个数组的方法-用循环遍历*/
try {
for(int i=0;;i++){
bys2[i] = bys[i];
}
} catch (ArrayIndexOutOfBoundsException e){
}
/*这种复制方式被称为深拷贝
* 而浅拷贝指的是直接将目标数组引用源数组
* 这种方式效率虽然很高,但他们指向的是堆中的同一块空间,
* 即元素发生变化,两个变量调用得到的结果是相同的
* 同时,目标数组原先指向的结构由于失去了所有来自栈的引用而被当做垃圾回收掉
* 这也是Java牛哔的一点,将内存管理全权交给了JVM,放心去new吧,麻麻再也不用担心我内存泄漏了*/
bys2 = bys;
/*同时Java类库中也提供了数组深拷贝的方法*/
/*这个方法是一个native方法,源码就不放出来了,总之效率很高就对了
* 参数1:源数组,参数2:元素组起始索引,参数3:目标数组,参数4:目标数组起始索引,参数5:要复制元素的数量
* 如果该数量超过了从起始索引到最大索引长度(即 数量 > 最大索引 - 起始索引)则抛出ArrayIndexOutOfBoundsException*/
System.arraycopy(bys,0,bys2,0,bys2.length);
/*这是数组的工具类提供的方法,方法体中还是调用了System.arraycopy*/
bys2 = Arrays.copyOf(bys,bys.length);
/*或者是使用clone方法复制出一块相同的结构,同样属于深拷贝
这也是一个native方法,自定义的class可以实现Cloneable接口重写此方法
来完成克隆操作*/
bys2 = bys.clone();
}
牛哔