Java 数组复制clone方法实现详解

这篇文章主要介绍了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;
}

二、运行结果

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

三、结果分析

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

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解java中的深拷贝和浅拷贝(clone()方法的重写、使用序列化实现真正的深拷贝)

    1.序列化实现 public class CloneUtils { @SuppressWarnings("unchecked") public static <T extends Serializable> T clone(T object){ T cloneObj = null; try { ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream obs = new Objec

  • Java Clone深拷贝与浅拷贝的两种实现方法

    1.首先,你要知道怎么实现克隆:实现Cloneable接口,在bean里面重写clone()方法,权限为public. 2.其次,你要大概知道什么是地址传递,什么是值传递. 3.最后,你要知道你为什么使用这个clone方法. 先看第一条,简单的克隆代码的实现.这个也就是我们在没了解清楚这个Java的clone的时候,会出现的问题. 看完代码,我再说明这个时候的问题. 先看我要克隆的学生bean的代码: package com.lxk.model; /** * 学生类:有2个属性:1,基本属性-S

  • Java中的数组复制(clone与arraycopy)代码详解

    JAVA数组的复制是引用传递,而并不是其他语言的值传递. 1.clone protectedObjectclone() throwsCloneNotSupportedException创建并返回此对象的一个副本."副本"的准确含义可能依赖于对象的类.这样做的目的是,对于任何对象x,表达式: x.clone()!=x为true,表达式: x.clone().getClass()==x.getClass()也为true,但这些并非必须要满足的要求.一般情况下: x.clone().equa

  • java 中clone()的使用方法

    java 中clone()的使用方法 前言: clone就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有: 1 使用new操作符创建一个对象 2 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存.程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间.分配完内存之后,

  • Java clone方法详解及简单实例

      Java clone方法详解 什么是"clone"? 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的.在 Java语言中,用简单的赋值语句是不能满足这种需求的.要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段. Java的所有类都默认继承java.lang.

  • Java Clone(类的复制)实例代码

    自己实现了一遍: 复制代码 代码如下: public class A implements Cloneable {public String str[]; A() {str = new String[2];} public Object clone() {A o = null;try {o = (A) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}o.str = new String[2];r

  • 详解Java中clone的写法

    Cloneable这个接口设计得十分奇葩,不符合正常人的使用习惯,然而用这个接口的人很多也很有必要,所以还是有必要了解一下这套扭曲的机制.以下内容来自于对Effective Java ed 2. item 11的整理.  Cloneable接口 首先,Cloneable接口中并没有方法.它的存在意义一是让程序员注明当前对象可以clone,二是改变父类Object类中clone方法的行为:如果某个类实现了Cloneable,那么它的父类Object的clone方法可以调用,否则会抛出CloneNo

  • java object 之clone方法全面解析

    1 protected native Object clone() throws CloneNotSupportedException; 1.方法由native关键字修饰 java中的native关键字表示这个方法是个本地方法,[java native说明].而且native修饰的方法执行效率比非native修饰的高. 2.方法由protected修饰 一个类在覆盖clone()方法时候,需要修改成public访问修饰符,这样才能保证其他所有的类都能够访问这个类的这个方法. 3.方法抛出Clon

  • Java 数组复制clone方法实现详解

    这篇文章主要介绍了Java 数组复制clone方法实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.源码 public class Test1 { public static void main(String[] args) { // Student[] arrs = new Student[] { new Student() { id = "22" } }; C# 可以简写法,Java不支持 Student[] arrs

  • Java中的clone方法实例详解

    Java中对象创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有几种方式可以创建对象呢? 1 使用new操作符创建一个对象 2 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存.程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间.分配完内存之

  • Java 数组内置函数toArray详解

    java.util.List中的toArray函数 java.util.List<E> @NotNull public abstract <T> T[] toArray(@NotNull T[] a) Returns an array containing all of the elements in this list in proper sequence (from first to last element); the runtime type of the returned

  • Vue中遍历数组的新方法实例详解

    1.foreach foreach循环对不能使用return来停止循环 search(keyword){ var newList = [] this.urls.forEach(item =>{ if(item.name.indexOf(keyword) != -1){ newList.push(item) } }) return newList } 2.filter item对象就是遍历数组中的一个元素,includes是es6中的新方法,在search方法中直接返回新数组 search(key

  • Java BigDecimal中divide方法案例详解

    1.首先说一下用法,BigDecimal中的divide主要就是用来做除法的运算.其中有这么一个方法. public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode) 第一个参数是除数,第二个参数代表保留几位小数,第三个代表的是使用的模式. BigDecimal.ROUND_DOWN:直接省略多余的小数,比如1.28如果保留1位小数,得到的就是1.2 BigDecimal.ROUND_UP:直接进位,比如1.21如

  • java compareTo和compare方法比较详解

    这两个方法经常搞混淆,现对其进行总结以加深记忆. compareTo(Object o)方法是java.lang.Comparable<T>接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable<T>接口的,必须重写public int compareTo(T o)方法,比如MapReduce中Map函数和Reduce函数处理的 <key,value>,其中需要根据key对键值对进行排序,所以,key实现了WritableComparable&l

  • Go Java算法之解码方法示例详解

    目录 解码方法 方法一:动态规划(Java) 方法二:动态规划——优化(go) 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : 'A' -> "1" 'B' -> "2" ... 'Z' -> "26" 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法).例如,"11106" 可以映射为: "AAJF" ,将消息分组为 (1 1 1

  • Java设计模式之工厂方法模式详解

    目录 1.工厂方法是什么 2.如何实现 3.代码实现 4.工厂方法模式的优点 5.拓展 1.工厂方法是什么 众所周知,工厂是生产产品的,并且产品供消费者使用.消费者不必关心产品的生产过程,只需要关心用哪种产品就行. 在Java世界中,工厂方法模式和现实功能类似.工厂即一个工厂类,提供获得对象(产品)的方法(工厂方法).其他类(消费者)需要用到某个对象时,只需调用工厂方法就行,不必new这个对象. 2.如何实现 1)创建产品的抽象类或接口---抽象产品 2)创建具体产品的类---具体产品 3)创建

  • java数组的初始化及操作详解

    数组的基本概念 如果说现在要求你定义100个整型变量,那么如果按照之前的做法,可能现在定义的的结构如下: int i1, i2, i3, ... i100; 但是这个时候如果按照此类方式定义就会非常麻烦,因为这些变量彼此之间没有任何的关联,也就是说如果现在突然再有一个要求,要求你输出这100个变量的内容,意味着你要编写System.out.println()语句100次. 其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作.数组本身属于引用数据类型,那么既然是引

  • Java正则表达式之split()方法实例详解

    本文实例讲述了Java正则表达式之split()方法.分享给大家供大家参考,具体如下: 1.方法介绍 (1)public String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串 (2)public String[] split(String regex,int limit) 根据匹配给定的正则表达式来拆分此字符串 2.方法实例 /** * @Title:Split.java * @Package:com.you.data * @Description:Ja

随机推荐