广告
返回顶部
首页 > 资讯 > 精选 >Java数组的拷贝方式有哪些
  • 149
分享到

Java数组的拷贝方式有哪些

2023-06-29 07:06:42 149人浏览 薄情痞子
摘要

这篇文章主要介绍了Java数组的拷贝方式有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。深拷贝与浅拷贝的区别假设现在有原数组A以及拷贝后的数组B,若是改变A中的某一个值,

这篇文章主要介绍了Java数组的拷贝方式有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

    深拷贝与浅拷贝的区别

    假设现在有原数组A以及拷贝后的数组B,若是改变A中的某一个值,B数组随之相应的发生变化的拷贝方式称为浅拷贝,反之B数组不受影响,则称为深拷贝;
    简单总结一下两者的概念:

    深拷贝:拷贝后,修改原数组,不会影响到新数组;

    浅拷贝:拷贝后,修改原数组,新数组也会相应的发生改变;

    1. for循环进行拷贝

    拷贝数值类型

    当数组中存放的元素为基本数据类型时,此时发生的是深拷贝;

    //1. for循环拷贝  (拷贝数值类型) ---深拷贝    public static void main(String[] args) {        int[] A = {1,2,3,4,5};        int[] B = new int[A.length];        for (int i = 0; i < A.length; i++) {            B[i] = A[i];        }        System.out.println("A : " + Arrays.toString(A));  //A : [1, 2, 3, 4, 5]        System.out.println("B : " + Arrays.toString(B));  //B : [1, 2, 3, 4, 5]        System.out.println("===========修改后===========");        A[0] = 100;        System.out.println("A : " + Arrays.toString(A));  //A : [100, 2, 3, 4, 5]        System.out.println("B : " + Arrays.toString(B));  //B : [1, 2, 3, 4, 5]    }    //打印对象数组的方法    public static void show(Num[] arrays) {        for (int i = 0; i < arrays.length; i++) {            System.out.print(arrays[i].getVal() + " ");        }        System.out.println();    }class Num{    public int val = 0;    public Num(int val) {        this.val = val;    }    public int getVal() {        return val;    }    public void setVal(int val) {        this.val = val;    }}

    拷贝引用类型

    当数组中存放的元素为引用数据类型时,此时发生的是浅拷贝;

    //1. for循环拷贝  (拷贝引用数据类型) ---浅拷贝    public static void main(String[] args) {        Num[] A = new Num[4];        A[0] = new Num(1);        A[1] = new Num(2);        A[2] = new Num(3);        A[3] = new Num(4);        Num[] B = new Num[4];        for (int i = 0; i < A.length; i++) {            B[i] = A[i];        }        show(A);  //1 2 3 4         show(B);  //1 2 3 4         System.out.println("===========修改后===========");        A[0].setVal(100);        show(A);  //100 2 3 4        show(B);  //100 2 3 4    }

    2. copyof / copyOfRange

    拷贝数值类型

    当数组中存放的元素为基本数据类型时,此时发生的是深拷贝;

    Arrays.copy(原数组,自定义新数组长度);

    Arrays.copyOfRange(原数组,from,to);

    注意拷贝截取的范围是左闭右开的[from,to)

    //2. copy / copyOfRange  (拷贝数值类型) ---深拷贝    public static void main(String[] args) {        int[] A = {1,2,3,4,5};        int[] B = Arrays.copyOf(A,A.length);        int[] C = Arrays.copyOfRange(A,1,3);        System.out.println("A : " + Arrays.toString(A));  //A : [1, 2, 3, 4, 5]        System.out.println("B : " + Arrays.toString(B));  //B : [1, 2, 3, 4, 5]        System.out.println("C : " + Arrays.toString(C));  //C : [2, 3]        System.out.println("===========修改后===========");        A[0] = 100;        System.out.println("A : " + Arrays.toString(A));  //A : [100, 2, 3, 4, 5]        System.out.println("B : " + Arrays.toString(B));  //B : [1, 2, 3, 4, 5]        System.out.println("C : " + Arrays.toString(C));  //C : [2, 3]    }

    拷贝引用类型

    当数组中存放的元素为类的对象时,此时发生的是浅拷贝;

    //2. copy / copyOfRange  (拷贝引用类型) ---浅拷贝    public static void main(String[] args) {        Num[] A = new Num[4];        A[0] = new Num(1);        A[1] = new Num(2);        A[2] = new Num(3);        A[3] = new Num(4);        Num[] B = Arrays.copyOf(A,A.length);        show(A);  //1 2 3 4        show(B);  //1 2 3 4        System.out.println("===========修改后===========");        A[0].setVal(100);        show(A);  //100 2 3 4        show(B);  //100 2 3 4    }class Num{    public int val = 0;    public Num(int val) {        this.val = val;    }    public int getVal() {        return val;    }    public void setVal(int val) {        this.val = val;    }}

    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的位置作为起始位置,再对比一下输出看看。

    //3. arraycopy  (拷贝数值类型) ---深拷贝    public static void main(String[] args) {        int[] A = {1,2,3,4,5};        int[] B = new int[A.length];        //System.arraycopy(A,0,B,0,A.length);        System.arraycopy(A,1,B,2,2);        System.out.println("A : " + Arrays.toString(A));  //A : [1, 2, 3, 4, 5]        System.out.println("B : " + Arrays.toString(B));  //B : [0, 0, 2, 3, 0]        System.out.println("===========修改后===========");        A[0] = 100;        System.out.println("A : " + Arrays.toString(A));  //A : [100, 2, 3, 4, 5]        System.out.println("B : " + Arrays.toString(B));  //B : [0, 0, 2, 3, 0]    }

    拷贝引用类型

    当数组中存放的元素为类的对象时,此时发生的是浅拷贝;

    //3. arraycopy  (拷贝引用类型) ---浅拷贝    public static void main(String[] args) {        Num[] A = new Num[4];        A[0] = new Num(1);        A[1] = new Num(2);        A[2] = new Num(3);        A[3] = new Num(4);        Num[] B = new Num[4];        System.arraycopy(A,0,B,0,A.length);        show(A);  //1 2 3 4        show(B);  //1 2 3 4        System.out.println("===========修改后===========");        A[0].setVal(100);        show(A);  //100 2 3 4        show(B);  //100 2 3 4    }class Num{    public int val = 0;    public Num(int val) {        this.val = val;    }    public int getVal() {        return val;    }    public void setVal(int val) {        this.val = val;    }}

    4. clone

    拷贝数值类型

    当数组中存放的元素为基本数据类型时,此时发生的是深拷贝;

    //4. clone  (拷贝数值类型) ---深拷贝    public static void main(String[] args) {        int[] A = {1,2,3,4,5};        int[] B = A.clone();        System.out.println("A : " + Arrays.toString(A));  //A : [1, 2, 3, 4, 5]        System.out.println("B : " + Arrays.toString(B));  //B : [1, 2, 3, 4, 5]        System.out.println("===========修改后===========");        A[0] = 100;        System.out.println("A : " + Arrays.toString(A));  //A : [100, 2, 3, 4, 5]        System.out.println("B : " + Arrays.toString(B));  //B : [1, 2, 3, 4, 5]    }

    拷贝引用类型

    当数组中存放的元素为类的对象时,此时发生的是浅拷贝;

    //4. clone  (拷贝引用类型) ---浅拷贝    public static void main(String[] args) {        Num[] A = new Num[4];        A[0] = new Num(1);        A[1] = new Num(2);        A[2] = new Num(3);        A[3] = new Num(4);        Num[] B = A.clone();        show(A);  //1 2 3 4        show(B);  //1 2 3 4        System.out.println("===========修改后===========");        A[0].setVal(100);        show(A);  //100 2 3 4        show(B);  //100 2 3 4    }

    5. 总结

    拷贝方式数值类型引用类型推荐使用
    for循环深拷贝浅拷贝 
    copyof深拷贝浅拷贝&radic;
    arraycopy深拷贝浅拷贝&radic;
    clone深拷贝浅拷贝 

    由于arraycopy底层是c++写的,所以速度快,更多的是使用这个方法。

    注意:本文中所有的引用数据类型都是以类的对象为例,使用的是对象数组,我们也知道引用类型包括类,接口,字符串等等。但是需要注意字符串是新的变量,所以如果是连个字符串数组进行拷贝,即使他们是引用类型,但是每次都会创建了一个字符串数组对象, 因此, 修改原数组, 不会影响到新数组,即深拷贝。

    感谢你能够认真阅读完这篇文章,希望小编分享的“Java数组的拷贝方式有哪些”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

    --结束END--

    本文标题: Java数组的拷贝方式有哪些

    本文链接: https://www.lsjlt.com/news/323297.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Java数组的拷贝方式有哪些
      这篇文章主要介绍了Java数组的拷贝方式有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。深拷贝与浅拷贝的区别假设现在有原数组A以及拷贝后的数组B,若是改变A中的某一个值,...
      99+
      2023-06-29
    • golang数组拷贝的方法有哪些
      在Go语言中,有以下几种方法可以进行数组的拷贝: 使用循环遍历:可以使用for循环将一个数组的元素逐个拷贝到另一个数组中。 fu...
      99+
      2023-10-20
      golang
    • java零拷贝的实现方式有哪些
      Java 的零拷贝(Zero-copy)是指在数据传输过程中,避免将数据从一个缓冲区复制到另一个缓冲区,从而提高数据传输的效率。Ja...
      99+
      2023-09-23
      java
    • java深拷贝的实现方式有哪些
      在Java中,深拷贝可以通过以下几种方式来实现:1. 实现Cloneable接口并重写clone()方法:Cloneable接口标记...
      99+
      2023-08-08
      java
    • JS数组拷贝技巧有哪些
      这篇文章主要为大家展示了“JS数组拷贝技巧有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS数组拷贝技巧有哪些”这篇文章吧。   技巧 1 - 使用Ar...
      99+
      2022-10-19
    • 详解Java数组的四种拷贝方式
      目录深拷贝与浅拷贝的区别1. for循环进行拷贝拷贝数值类型拷贝引用类型2. copyof / copyOfRange拷贝数值类型拷贝引用类型3. arraycopy拷贝数值类型拷贝...
      99+
      2022-11-13
    • javascript深拷贝实现的方式有哪些
      本篇内容主要讲解“javascript深拷贝实现的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript深拷贝实现的方式有哪些”吧!概念介绍深拷贝:在堆内存中重新开辟一个存...
      99+
      2023-07-02
    • js浅拷贝的方法有哪些
      这篇文章给大家分享的是有关js浅拷贝的方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JavaScript是什么JS是JavaScript的简称,它是一种直译式的脚本语言,其解释器被称为JavaScrip...
      99+
      2023-06-14
    • javascript深拷贝和浅拷贝的区别有哪些
      这篇文章主要介绍“javascript深拷贝和浅拷贝的区别有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“javascript深拷贝和浅拷贝的区别有哪些”文章能...
      99+
      2022-10-19
    • 字符串拷贝函数的方法有哪些
      本篇内容介绍了“字符串拷贝函数的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!strcpy,即s...
      99+
      2022-10-19
    • python拷贝文件的方法有哪些
      Python拷贝文件的方法有以下几种:1. 使用shutil模块的copy()函数:```pythonimport shutilsh...
      99+
      2023-08-15
      python
    • Linux拷贝目录的方法有哪些
      在Linux中,有几种方法可以用来拷贝目录:1. 使用cp命令:cp命令是最常用的拷贝文件和目录的命令。要拷贝目录,需要使用“-r”...
      99+
      2023-09-07
      Linux
    • js中深拷贝和浅拷贝的区别有哪些
      这篇文章主要介绍js中深拷贝和浅拷贝的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!javascript是一种什么语言javascript是一种动态类型、弱类型的语言,基于对象和事件驱动并具有相对安全性并广...
      99+
      2023-06-14
    • javascript中深拷贝函数有哪些
      这篇文章将为大家详细讲解有关javascript中深拷贝函数有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点击,给用户提供更好的体...
      99+
      2023-06-14
    • vue深拷贝的实现方法有哪些
      这篇文章主要讲解了“vue深拷贝的实现方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue深拷贝的实现方法有哪些”吧!vue深拷贝的三种实现方式:1、通过递归方式实现深拷贝;2、J...
      99+
      2023-07-05
    • Linux拷贝文件夹的方法有哪些
      在Linux中,有多种方法可以拷贝文件夹。以下是其中一些常见的方法:1. 使用cp命令:cp -r 源文件夹 目标文件夹。这将递归地...
      99+
      2023-10-23
      Linux
    • java如何实现数组的拷贝
      这篇文章主要介绍java如何实现数组的拷贝,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数组的拷贝 第一种:  把一个数组的值拷贝到另一个数组 public stat...
      99+
      2023-06-27
    • java 文件拷贝的四种方式
      1. java 移动文件的方式有几种? 在 Java 中,可以使用多种方法来移动文件。 //使用 java.nio.file.Files 类的 move() 方法:import java.nio.fi...
      99+
      2023-09-02
      java servlet jvm
    • js数组直接赋值的问题(js数组的浅拷贝与深拷贝方法)
      1、数组的直接赋值属于数组的浅拷贝,JS存储对象都是存内存地址,所以浅拷贝会导致新数组和旧数组共用同一块内存地址,其中一个数组变化,另一个数组也会相应的变化。 var a =[1,2...
      99+
      2022-11-13
      JS数组直接赋值 js数组浅拷贝 js数组深拷贝 js array直接赋值 js array浅拷贝 js array深拷贝
    • java编程中拷贝数组的方式及相关问题分析
      JAVA数组的复制是引用传递,而并不是其他语言的值传递。这里介绍java数组复制的4种方式极其问题:第一种方式利用for循环:int[] a={1,2,4,6};int length=a.length;int[] b=new int[len...
      99+
      2023-05-30
      java 数组复制 ava
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作