Java 数组复制之clone方法

一、源码

public class Test1 {
    public static void main(String[] args) {
        // Student[] arrs = new Student[] { new Student() { id = "22" } }; C# 可以简写法,Java不支持
        Student[] arrs = new Student[1];
        Student st = new Student();
        st.id = 12;
        st.name = "qwe";
        arrs[0] = st;
        Student[] arrss = arrs.clone();
        System.out.println(arrs == arrss);
        System.out.println(arrs.equals(arrss));
        arrss[0].id = 56;
        for (int i = 0; i < arrs.length; i++) {
            System.out.println(arrs[i].id + arrs[i].name);
        }
        for (int i = 0; i < arrss.length; i++) {
            System.out.println(arrss[i].id + arrss[i].name);
        }
        System.out.println("-------------自定义对象类型数组clone-------------");

        Student[] arrst1 = new Student[1];
        Student st1 = new Student();
        st1.id = 162;
        st1.name = "qkkj";
        arrst1[0] = st1;
        Student[] arrst2 = arrst1;
        System.out.println(arrst1 == arrst2);
        System.out.println(arrst1.equals(arrst2));
        arrst2[0].id = 996;
        for (int i = 0; i < arrst1.length; i++) {
            System.out.println(arrst1[i].id + arrst1[i].name);
        }
        for (int i = 0; i < arrst2.length; i++) {
            System.out.println(arrst2[i].id + arrst2[i].name);
        }
        System.out.println("-------------自定义对象类型数组= 赋值-------------");

        var arr1 = new String[] { "we", "dfeffg" };
        var arr = arr1.clone();
        System.out.println(arr1 == arr);
        System.out.println(arr1.equals(arr));
        arr[1] = "ddddddddddddddd";
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
        System.out.println("------------字符串数组clone--------------");

        var arr11 = new String[] { "we", "dfeffg" };
        var arr111 = arr11;
        System.out.println(arr111 == arr11);
        System.out.println(arr111.equals(arr11));
        arr111[1] = "ddddddddddddddd";
        for (int i = 0; i < arr11.length; i++) {
            System.out.println(arr11[i]);
        }
        for (int i = 0; i < arr111.length; i++) {
            System.out.println(arr111[i]);
        }
        System.out.println("------------字符串数组=赋值--------------");

        var arr2 = new int[] { 232, 45 };
        var arr3 = arr2.clone();
        System.out.println(arr2 == arr3);
        System.out.println(arr2.equals(arr3));
        arr3[1] = 4444;
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]);
        }
        for (int i = 0; i < arr3.length; i++) {
            System.out.println(arr3[i]);
        }
        System.out.println("------------数字类型数组clone--------------");

        var arr4 = new int[] { 23432, 44455 };
        var arr5 = arr4;
        System.out.println(arr4 == arr5);
        System.out.println(arr4.equals(arr5));
        arr4[1] = 6666;
        for (int i = 0; i < arr4.length; i++) {
            System.out.println(arr4[i]);
        }
        for (int i = 0; i < arr5.length; i++) {
            System.out.println(arr5[i]);
        }
        System.out.println("------------数字类型数组=赋值-----------------");
    }
}

class Student {
    public int id;
    public String name;

    public Student() {

    }

    public Student(String name, int id) {
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

二、运行结果

false
false
56qwe
56qwe
-------------自定义对象类型数组clone-------------
true
true
996qkkj
996qkkj
-------------自定义对象类型数组= 赋值-------------
false
false
we
ddddddddddddddd
we
dfeffg
------------字符串数组clone--------------
true
true
we
ddddddddddddddd
we
ddddddddddddddd
------------字符串数组=赋值--------------
false
false
232
45
232
4444
------------数字类型数组clone--------------
true
true
23432
6666
23432
6666
------------数字类型数组=赋值-----------------

三、结果分析

  1.clone复制,对于数组本身而言,它的元素是引用类型(字符串除外)的时候,本来数组每个元素中保存的就是对象的引用,所以,拷贝过来的数组自然而言也是对象的引用,所以对于数组对象元素而言,它又是浅拷贝;

  2.clone复制,对于引用类型(字符串除外),改变其中一个中的值,会影响另外一个值,相当于“浅拷贝”;

  3.clone复制,对于值类型、字符串,改变其中一个中的值,不会影响另外一个值,相当于“深拷贝”;

  4.等号复值后修改一个后会影响另一个

原文地址:https://www.cnblogs.com/zhuanjiao/p/11874784.html

时间: 2024-10-14 00:56:51

Java 数组复制之clone方法的相关文章

Java数组的十大方法

Java数组的十大方法 以下是Java Array的前10种方法.他们是来自stackoverflow的投票最多的问题. 0.声明一个数组 String[] aArray = new String[5]; String[] bArray = {"a","b","c", "d", "e"}; String[] cArray = new String[]{"a","b",

java Object对象的clone方法

参考copy链接:http://blog.csdn.net/bigconvience/article/details/25025561 在看原型模式,发现要用到clone这个方法,以前和朋友聊过,没怎么看过,刚好要用,就看看了. 源码解释: /** * Creates and returns a copy of this object. The precise meaning * of "copy" may depend on the class of the object. The

Java高级特性:clone()方法

目录 源码 深拷贝和浅拷贝 对象串行化实现拷贝 常见面试题 源码 public class Objcet{ protected native Object clone() throws CloneNotSupportedException(); } 由源码可知. 第一:Objcet类的clone()方法是一个native方法.native方法的执行效率一般远高于Java中的非native方法(一般不是java语言所写).这也解释了为什么要用Object的clone()方法,而不是先new一个类,

java:数组复制

在java中实现数组的复制有很多种方法,可以使用循环给数组赋值达到复制的效果,其实java自带了一个方法可以实现数组的复制 System.arraycopy(a,a_index,b,b_index,length); 参数介绍: a:数组源的名字 a_index:从数组源中的哪个下标起始开始复制 b:目的数组的名字 b_index:接收到的复制内容在目的数组中插入的位置 举个例子: int[] a = {1,2,3}; int[] b = new int[3] ; System.arraycopy

Java数组操作十大方法

0.定义一个Java数组 String[] aArray = new String[5]; String[] bArray = {"a","b","c", "d", "e"}; String[] cArray = new String[]{"a","b","c","d","e"}; 第一种是定义了一个数组,并

java数组复制的几种常见用法

1.1数组复制的几种常见用法 1.1.1System.arraycopy的用法 int[] src = {1,3,5,7,9,11,13,15,17}; int[] dest = {2,4,6,8,10,12,14,16,18,20}; //从src中的第一个元素起复制三个元素,即1,3,5复盖到dest第2个元素开始的三个元素 System.arraycopy(src, 0, dest, 1, 3); System.out.println(Arrays.toString(dest)); 结果为

Java数组去掉反复的方法集

经经常使用到,有时候不仅仅是简单的基本类型,那种能够用set集合去重,好多时间用到的是我们自己定义的类型,以下举个样例(我这儿就那int举例了): 方法一. 这样的类似与选择排序算法,首先我们取i值,然后将i之后的全部反复的去掉.详细实现例如以下: import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * 创建时间:2014-11-18 下午3:26:35 * * @author zhangtia

Java数组的一些使用方法

数组 用于存储一组同一数据类型数据的容器 数组会对放入其中的数据自动编号,编号是从0开始的---下标 定义格式 数据类型[] 数组名 = new 数据类型[数组的大小];---可以先声明再初始化 int[] arr = new int[5];---定义了一个最多能存储5的整数的数组 arr[3] = 4; arr[3]---通过数组名[下标]的形式来获取数组元素或者给对应的位置赋值 数据类型[] 数组名 = new 数据类型[]{元素1,元素2--}; int[] arr = new int[]

Java数组去掉重复的方法集

经常用到,有时候不只是简单的基本类型,那种可以用set集合去重,好多时间用到的是我们自定义的类型,下面举个例子(我这儿就那int举例了): 方法一. 这种类似与选择排序算法,首先我们取i值,然后将i之后的所有重复的去掉.具体实现如下: import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * 创建时间:2014-11-18 下午3:26:35 * * @author zhangtianyou *