假设现在有原数组A以及拷贝后的数组B,若是改变A中的某一个值,B数组随之相应的发生变化的拷贝方式称为浅拷贝,反之B数组不受影响,则称为深拷贝;简单总结一下两者的概念:
深拷贝:拷贝后,修改原数组,不会影响到新数组;
浅拷贝:拷贝后,修改原数组,新数组也会相应的发生改变;
1. for循环进行拷贝 拷贝数值类型当数组中存放的元素为基本数据类型时,此时发生的是深拷贝;
拷贝引用类型当数组中存放的元素为引用数据类型时,此时发生的是浅拷贝;
2. copyof / copyOfRange 拷贝数值类型当数组中存放的元素为基本数据类型时,此时发生的是深拷贝;
Arrays.copy(原数组,自定义新数组长度);
Arrays.copyOfRange(原数组,from,to);
注意拷贝截取的范围是左闭右开的[from,to)
拷贝引用类型当数组中存放的元素为类的对象时,此时发生的是浅拷贝;
3. arraycopy 拷贝数值类型当数组中存放的元素为基本数据类型时,此时发生的是深拷贝;
System.arraycopy(src, srcPos dest, destPos, length);
其中各个参数分别表示 如下:
src :源数组srcPos:源数组要复制的起始位置dest:目标数组destPos:目标数组复制的起始位置length:复制的长度所以srcPos和destPos都为0,且length为源数组长度时,表示完完整整的拷贝过来了;那么截取范围拷贝也举个例子,下面的代码中srcPos = 1,destPos = 2,length = 2,表示从A数组下标为1的位置开始截取2个元素,放到B数组中下标为2的位置作为起始位置,再对比一下输出看看。
拷贝引用类型当数组中存放的元素为类的对象时,此时发生的是浅拷贝;
4. clone 拷贝数值类型当数组中存放的元素为基本数据类型时,此时发生的是深拷贝;
拷贝引用类型当数组中存放的元素为类的对象时,此时发生的是浅拷贝;
5. 总结 拷贝方式数值类型引用类型推荐使用for循环深拷贝浅拷贝 copyof深拷贝浅拷贝√arraycopy深拷贝浅拷贝√clone深拷贝浅拷贝由于arraycopy底层是C++写的,所以速度快,更多的是使用这个方法。
注意:本文中所有的引用数据类型都是以类的对象为例,使用的是对象数组,我们也知道引用类型包括类,接口,字符串等等。但是需要注意字符串是新的变量,所以如果是连个字符串数组进行拷贝,即使他们是引用类型,但是每次都会创建了一个字符串数组对象, 因此, 修改原数组, 不会影响到新数组,即深拷贝。
以上就是详解Java数组的四种拷贝方式的详细内容,更多关于Java数组拷贝的资料请关注七叶笔记其它相关文章!