数组拷贝

首先了解深拷贝 浅拷贝
数组的四种拷贝方式:

1.for循环拷贝

代码示例:

  1. import java.util.Arrays;
  2. public class TestDemo{
  3. public static void main(String[] args) {
  4. int[] array1 ={1,2,3,4,5,6};
  5. int[] array2 =new int [array1.length];
  6. for (int i = 0; i <array1.length ; i++) {
  7. array2[i] = array1[i];
  8. }
  9. System.out.println(Arrays.toString(array1));
  10. System.out.println(Arrays.toString(array2));
  11. }
  12. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

结果:

此时,修改array2 0下标的值,发现对array1没影响;

  1. import java.util.Arrays;
  2. public class TestDemo{
  3. public static void main(String[] args) {
  4. int[] array1 ={1,2,3,4,5,6};
  5. int[] array2 =new int [array1.length];
  6. for (int i = 0; i <array1.length ; i++) {
  7. array2[i] = array1[i];
  8. }
  9. System.out.println("==============");
  10. array2[0]=99;
  11. System.out.println(Arrays.toString(array1));
  12. System.out.println(Arrays.toString(array2));
  13. }
  14. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

结果:

创建了一个数组对象, 拷贝原有数组中的所有元素到新数组中. 因此, 修改原数组, 不会影响到新数组,即通过一个引用去修改拷贝后的值,发现并不影响原来对象的值,这种拷贝属于深拷贝。

2.copyof拷贝

代码示例:

  1. public static void main(String[] args) {
  2. int[] array1 = {1,2,3,4,5,6};
  3. System.out.println(Arrays.toString(array1));
  4. int[] array2 = Arrays.copyOf(array1,array1.length);
  5. System.out.println("==============");
  6. array2[0]=99;
  7. System.out.println(Arrays.toString(array1));
  8. System.out.println(Arrays.toString(array2));
  9. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

结果:

同第一个: copyOf 是将数组进行了 深拷贝, 即又创建了一个数组对象, 拷贝原有数组中的所有元素到新数组中。因此, 修改原数组,不会影响到新数组。

3.System.arraycopy拷贝

  1. import java.util.Arrays;
  2. public class TestDemo {
  3. public static void main(String[] args) {
  4. int[] array1 = {1, 2, 3, 4, 5, 6};
  5. int[] array2 = new int[array1.length];
  6. System.out.println(Arrays.toString(array1));
  7. System.arraycopy(array1, 0, array2, 0, array1.length);
  8. System.out.println("==============");
  9. array2[0] = 99;
  10. System.out.println(Arrays.toString(array1));
  11. System.out.println(Arrays.toString(array2));
  12. }
  13. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

结果:

System.arraycopy拷贝也为深拷贝。

前三种拷贝方式速度最快是System.arraycopy拷贝。

4.clone拷贝

  1. 引用.clone
  2. 克隆 这个引用所指向的对象
  3. 这个引用所指向的对象就会被克隆(生成一个副本)
  • 1
  • 2
  • 3

代码示例;

  1. public static void main(String[] args) {
  2. int[] array1 = {1, 8, 9, 4, 13, 26};
  3. System.out.println(Arrays.toString(array1));
  4. //array2 指向了刚刚生成的副本
  5. int [] array2 = array1.clone();
  6. System.out.println("==============");
  7. array2[0] = 99;
  8. System.out.println(Arrays.toString(array1));
  9. System.out.println(Arrays.toString(array2));
  10. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

结果:

此时也可以看出,修改原数组, 不会影响到新数组。所以也为深拷贝。
实际上,本质来说这四种都属于浅拷贝
上面四种属于深拷贝的原因是因为刚刚数组中存放的是简单类型
如果放的是引用类型,它们均属于浅拷贝。
画图说明浅拷贝:

当数组中存放的是引用类型时,修改array2中的某个元素的值,同时也修改了array1中的值,这种方法叫浅拷贝。
怎么修改成深拷贝呢?当我们拷贝array1时,将它所引用的值也拷贝过来,此时修改array2中的某个元素的值,array1中的值不变,如图:

总结:

这四种数组拷贝的方式均为浅拷贝

几个小知识点:

1.拷贝部分数组;

代码示例:

  1. public static void main(String[] args) {
  2. int[] array1 = {2, 8, 9, 10, 12, 26};
  3. int[] ret = Arrays.copyOfRange(array1,2,5);
  4. System.out.println(Arrays.toString(ret));
  5. }
  • 1
  • 2
  • 3
  • 4
  • 5

结果:

2.比较两个数组

代码示例:

  1. public static void main(String[] args) {
  2. int[] array1 = {2, 8, 9, 10, 12, 26};
  3. int[] array2 = {2, 8, 9, 10, 12, 26, 30,35};
  4. System.out.println(Arrays.equals(array1, array2));
  5. }
  • 1
  • 2
  • 3
  • 4
  • 5

结果:

3.数组完全填充

代码示例:

  1. public static void main(String[] args) {
  2. int[] array1 =new int[10];
  3. Arrays.fill(array1,6);
  4. System.out.println(Arrays.toString(array1));
  5. }
  • 1
  • 2
  • 3
  • 4
  • 5

结果:

4.数组部分填充

代码示例:

  1. public static void main(String[] args) {
  2. int[] array1 =new int[10];
  3. Arrays.fill(array1,2,6,8);
  4. System.out.println(Arrays.toString(array1));
  5. }
  • 1
  • 2
  • 3
  • 4
  • 5

结果:

完。(要我的命)

原文章:https://blog.csdn.net/weixin_44436675/article/details/112012315

Java-数组拷贝的更多相关文章

  1. Java 数组拷贝方法 System.arraycopy

    System类提供的数组拷贝方法: public static native void arraycopy(Object src, int srcPos, Object dest, int destP ...

  2. Java数组拷贝的五种方法

    在Java中有多种方法可以拷贝一个数组,到另外一个数组. 1.循环拷贝 在循环拷贝方法中,只需要利用i,移动指针即可复制所有数组到arrayB中. for(int i=0;i<arrayA.le ...

  3. Java数组声明与拷贝的几种方式

    Java数组声明的三种方式 第一种(声明并初始化):          数据类型[] 数组名={值,值,...};          例:int[] a = {1,2,3,4,5,6,7,8};    ...

  4. java 数组复制

    http://www.cnblogs.com/zhengbin/p/5671403.html http://www.cnblogs.com/jjdcxy/p/5870524.html Java数组拷贝 ...

  5. java杂记——数组拷贝

    这里介绍两种java提供的数组拷贝方法: (1)Arrays提供的copyOf(T src, T desLength)和copyOfRange(T src, int from, int to) (2) ...

  6. Java基础知识强化85:System类之arraycopy()方法(数组拷贝)

    1. arraycopy方法(数组拷贝) public static void arraycopy(object src,int srcPos,Object dest,int destPos, int ...

  7. Java 数组的三种创建方法,数组拷贝方法

    public static void main(String[] args) {//创建数组的第一种方法int[] arr=new int[6];int intValue=arr[5];//Syste ...

  8. Java数组(初学者必看)

    数组无论在哪种编程语言中都算是最重要的数据结构之一,同时不同语言的实现及处理也不尽相同.但凡写过一些程序的人都知道数组的价值及理解数组的重要性,与链表一道,数组成为了基本的数据结构.尽管Java提供了 ...

  9. java提高(15)---java深浅拷贝

    #java深浅拷贝 一.前言 为什么会有深浅拷贝这个概念? 我觉得主要跟JVM内存分配有关,对于基本数据类型,只存在栈内存,所以它的拷贝不存在深浅拷贝这个概念.而对于对象而言,一个对象的创建会在内存中 ...

  10. Java开发知识之Java数组

    Java开发知识之Java数组 一丶数组简介 首先,不管是Java 还是 C++ 还是其它语言.都有数组. (有可能叫法不同) 数组简而言之就是存储一段连续相同数据类型的数据结构 在Java中数组可以 ...

随机推荐

  1. 使用 Azure Container Registry 储存镜像

    Azure Container Registry(容器注册表)是基于 Docker Registry 2.0规范的托管专用 Docker 注册表服务. 可以创建和维护 Azure 容器注册表来存储与管 ...

  2. Day003 变量、常量、作用域

    变量 变量:就是可以变化的量 Java是一种强类型语言,每个变量都必须声明其类型. Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域 变量的定义 数据类型 变量名 = 值:可以 ...

  3. MySQL连接本地服务器

    1.打开"控制面板" 2.搜索"管理工具",并点击第一个"管理工具" 3.双击"服务" 4.找到"MySQL& ...

  4. 通过CRM系统实现工作流程自动化

    灵活运用CRM系统所拥有的自动化功能模块,是公司在快速发展和降低成本的关键保障.不管您的公司规模的大小,您企业的工作流程都必须遵照相同的流程反复操作.这种反复的工作是一个效率黑洞,长久以往会导致人力资 ...

  5. [刷题] 19 Remove Nth Node From End of List

    要求 给定一个链表,删除倒数第n个节点 示例 1->2->3->4->5->NULL , n=2 1->2->3->5 边界 n是从0还是从1计 n不合 ...

  6. python-dict和list常用方法

    1 # *********-list-********* 2 # 创建一个list 3 list1 = [1, 2, '力气,', 'afd'] 4 print(type(list1)) 5 prin ...

  7. Linux进阶之链路聚合

    CentOS7用命令配置链路聚合 链路聚合是一个计算机网络术语,将多个物理端口汇聚在一起,形成一个逻辑端口,以实现出入流量在各成员端口的负荷分担,交换机根据用户配置的端口负荷分担策略决定网络封包从哪个 ...

  8. STM32之HAL库、标准外设库、LL库(STM32 Embedded Software)-(转载)

    STM32 Embedded Software  工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是 ...

  9. Java lambda 表达式详解(JDK 8 新特性)

    什么是 lambda 表达式 lambda 表达式(拉姆达表达式)是 JAVA 8 中提供的一种新的特性,它使 Java 也能进行简单的"函数式编程". lambda 表达式的本质 ...

  10. LINUX创建文件和目录的默认权限

    在linux中,一位用户在创建文件和目录时,对其具有的权限都是一样的,如需更改,需要chmod命令做相应的更改.为什么?其实是权限掩码起作用了. 权限掩码的作用就是规范初创文件和目录时候的权限设置,免 ...