System.arraycopy()方法及对象的深复制和浅复制

1、System.arraycopy方法实现数组的复制

1-1:System中提供了一个native静态方法arraycopy(),可以使用这个方法实现数组之间的复制。对于普通的一维数组来说,会复制每个数组的值到另一个数组中,即每个元素都是按值传递,修改副本不会影响原来的值。方法原型及复制复制基本类型数组的示例如下:

/**

* System.arraycopy的方法原型

* @param src      要复制的源数组

* @param srcPos    源数组要复制的起始位置(从0开始)

* @param dest      要复制的目标数组

* @param destPos  目标数组的起始位置(从0开始)

* @param length    要复制的长度

*/publicstaticnativevoidarraycopy(Object src,intsrcPos,Object dest,intdestPos,intlength);

publicstaticvoidmain(String[]args){int[]nums={1024,1025,1026,1027,1028};int[]copyOfNums=newint[nums.length];System.arraycopy(nums,0,copyOfNums,0,nums.length);//修改拷贝数组的元素copyOfNums[3]=1234;//观察原数组有无变化System.out.println(Arrays.toString(nums));}

输出结果:[1024, 1025, 1026, 1027, 1028]

因为复制普通数组时,按值传递,会把每个元素的值复制一份给新数组,所以修改副本不会影响原来的值。

字符串数组就比较特殊了,先看代码:

String[]names={"王昭君","赵飞燕","陈圆圆","杨玉环","苏妲己"};System.out.println("原数组中每个元素的哈希码:");for(String name:names){System.out.print(Integer.toHexString(name.hashCode())+", ");}String[]copyOfNames=newString[names.length];System.arraycopy(names,0,copyOfNames,0,names.length);copyOfNames[1]="洛神甄氏";System.out.println("\n复制数组中每个元素的哈希码,1号元素的哈希码已经发生了改变:");for(String name:copyOfNames){System.out.print(Integer.toHexString(name.hashCode())+", ");}System.out.println();//修改copyOfNames中元素后的原数组内容没有改变System.out.println(Arrays.toString(names));

运行后的结果如下:

原数组中每个元素的哈希码:

1be7059, 225f8ec, 23f0508, 1929eae, 1f6458e,

复制数组中每个元素的哈希码,1号元素的哈希码已经发生了改变:

1be7059, 336eea6e, 23f0508, 1929eae, 1f6458e,

[王昭君, 赵飞燕, 陈圆圆, 杨玉环, 苏妲己]

内存图如下:

1-2:复制对象数组

//实体类publicclassBeauty{privateString name;privateintlevel;privatedoubleface;publicBeauty(){}publicBeauty(String name,intlevel,doubleface){this.setName(name);this.setLevel(level);this.setFace(face);}@OverridepublicStringtoString(){returnname+", "+level+", "+face;}//省略 getters/setters}

//测试方法publicclassArraycopyDemo{publicstaticvoidmain(String[]args){Beauty[]beauties=newBeauty[5];beauties[0]=newBeauty("王昭君",5,86.25);beauties[1]=newBeauty("赵飞燕",6,76.25);beauties[2]=newBeauty("陈圆圆",7,56.25);beauties[3]=newBeauty("杨玉环",8,66.25);beauties[4]=newBeauty("苏妲己",9,96.25);Beauty[]newBeauties=newBeauty[beauties.length];System.arraycopy(beauties,0,newBeauties,0,beauties.length);//修改复制后数组元素的属性newBeauties[1].setName("洛神甄氏");//打印原数组中的内容,观察1号元素的name属性,已经被修改了for(Beauty beauty:beauties){System.out.println(beauty);}}}

运行结果:

内存原理如下:

得出的结论:

1、当数组为一维数组,且元素为基本类型或String类型时,属于深复制,即原数组与新数组的元素不会相互影响

2、当数组为多维数组,或一维数组中的元素为引用类型时,属于浅复制,原数组与新数组的元素引用指向同一个对象

这里说的影响,是两个数组复制后对应的元素,并不一定是下标对应

String的特殊是因为它的不可变性

多维数组实际上可以理解为一维数组中的每个元素又是一个一维或多维数组的首地址,所以复制时的效果与对象数组的结果是一样的

老九学堂出品,转载请私信哦

对于文章内容有不理解的可以添加老九君个人QQ:614940318,请备注来自简书

老九学堂免费C、C++、Java课程地址:

https://study.163.com/courses-search?keyword=%E8%80%81%E4%B9%9D%E5%AD%A6%E5%A0%82

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • 第四天 数组【悟空教程】 第04天 Java基础 第1章数组 1.1数组概念 软件的基本功能是处理数据,而在处理数...
    Java帮帮阅读 1,599评论 0 9
  • DAY 05 1、 public classArrayDemo { public static void mai...
    周书达阅读 669评论 0 0
  • 基本数据结构中,数组是很重要的,这篇小猿圈加加对数组详解一席,具体使用,在学习过程中有困惑的朋友,可以看一下加加的...
    小猿圈加加阅读 474评论 0 0
  • 堆是一棵满足一定性质的二叉树,具体的讲堆具有如下性质:父节点的键值总是不大于它的孩子节点的键值(小顶堆), 堆可以...
    9527Roy阅读 631评论 0 0
  • 1、Java 实例 – 数组排序及元素查找:使用sort()方法对Java数组进行排序,使用 binarySear...
    JWking阅读 466评论 0 1