微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – Arrays.copyOf是否生成浅或深的副本?

关于 Arrays.copyOf是否会产生深浅的副本,似乎有很多混乱和不同的意见([1]和其他来源).

该测试表明该副本很深:

String[] sourceArray = new String[] { "Foo" };
String[] targetArray = java.util.Arrays.copyOf( sourceArray,1 );

sourceArray[0] = "Bar";

assertthat( targetArray[0] ).isEqualTo( "Foo" ); // passes

该测试表明该副本较浅:

String[][] sourceArray = new String[][] { new String[] { "Foo" } };
String[][] targetArray = java.util.Arrays.copyOf( sourceArray,1 );

sourceArray[0][0] = "Bar";

assertthat( targetArray[0][0] ).isEqualTo( "Foo" ); // fails

解决方案只是制作了顶层维度的深层副本,但其他维度是浅拷贝?真相是什么?

[1] How do I do a deep copy of a 2d array in Java?

解决方法

它产生一个浅拷贝,即包含“旧”引用的新数组(对于相同的对象,那些不被复制).

特别是,如果你有嵌套的数组,那些不会被复制.你会得到一个新的数组,其“顶级”指向与原来相同的“第二级”数组.这些嵌套数组中的任何更改都将反映在副本和原始内容中.

This test suggests that the copy is deep:

不,不是的.当您将新对象分配给“原始”数组时,这不会影响副本.毕竟,这是一个副本.

这是一样的情况:

String x = "foo";
String y = x;
x = "bar";

assertEquals(y,"foo");

没有“深抄”这里.

原文地址:https://www.jb51.cc/java/124646.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐