java – Arrays.copyOf是否生成浅或深的副本?
发布时间:2020-12-14 16:39:41 所属栏目:Java 来源:网络整理
导读:关于 Arrays.copyOf是否会产生深浅的副本,似乎有很多混乱和不同的意见([1]和其他来源). 该测试表明该副本很深: String[] sourceArray = new String[] { "Foo" };String[] targetArray = java.util.Arrays.copyOf( sourceArray,1 );sourceArray[0] = "Bar";a
关于
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? 解决方法
它产生一个浅拷贝,即包含“旧”引用的新数组(对于相同的对象,那些不被复制).
特别是,如果你有嵌套的数组,那些不会被复制.你会得到一个新的数组,其“顶级”指向与原来相同的“第二级”数组.这些嵌套数组中的任何更改都将反映在副本和原始内容中.
不,不是的.当您将新对象分配给“原始”数组时,这不会影响副本.毕竟,这是一个副本. 这是一样的情况: String x = "foo"; String y = x; x = "bar"; assertEquals(y,"foo"); 没有“深抄”这里. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |