Java数组总是相等的
我有一个二维数组2。我将其设置为number2copy,number2copy=number2 然后,我调用一个归零的方法,将2d数组传递给它ToBeZeroed。这个方法用0填充数组,我知道它是有效的。它返回到满是零的状态。但是,当我把数字2=托比塞勒厄德;Java数组总是相等的,java,arrays,hyperlink,zero,Java,Arrays,Hyperlink,Zero,我有一个二维数组2。我将其设置为number2copy,number2copy=number2 然后,我调用一个归零的方法,将2d数组传递给它ToBeZeroed。这个方法用0填充数组,我知道它是有效的。它返回到满是零的状态。但是,当我把数字2=托比塞勒厄德; number2copy也用零填充。我如何分解这些东西,使其中一个的变化不会导致另一个的变化?它们是不相关的数组,因此需要单独处理< /p> < p> java不是C++。将引用复制到属性为第一个维度的数组,而不是数组对象和数组子对象。您需
number2copy也用零填充。我如何分解这些东西,使其中一个的变化不会导致另一个的变化?它们是不相关的数组,因此需要单独处理< /p> < p> java不是C++。将引用复制到属性为第一个维度的数组,而不是数组对象和数组子对象。您需要使用
number2copy=(int[][])deepCopy(number2)代码>,它将执行适合您需要的深层数组副本,包括包含在中的二维数组的副本。用int[][]
替换您没有告诉我们的2D数组数据类型:)此外,要检查一个对象是否等于另一个对象,==
将检查对2D数组的第一维数组的引用,这可能不是您想要的。对于深度检查,使用数组.deepEquals(number2,number2copy)代码>,应该可以正常工作
深度复制源代码:
public static Object deepCopy(Object src)
{
int srcLength = Array.getLength(src);
Class srcComponentType = src.getClass().getComponentType();
Object dest = Array.newInstance(srcComponentType, srcLength);
if (srcComponentType.isArray())
{
for (int i = 0; i < Array.getLength(src); i++)
Array.set(dest, i, deepCopy(Array.get(src, i)));
}
else
{
System.arraycopy(src, 0, dest, 0, srcLength);
}
return dest;
}
公共静态对象deepCopy(对象src)
{
int srcLength=Array.getLength(src);
类srcComponentType=src.getClass().getComponentType();
Object dest=Array.newInstance(srcComponentType,srcLength);
if(srcComponentType.isArray())
{
for(int i=0;i
请参阅以获取简短的解释
编辑:我只是注意到他说的是2D数组,所以适当地修改了答案:)Java中的数组是对象,因此具有引用语义。也就是说,赋值操作x=y代码>别名和x
和y
现在都指同一个实际对象
(与之相反的是值语义,y
的值被复制到不同的值x
;诸如int
等基本类型具有值语义。)
您需要创建一个显式的新的数组,并复制数据
值和引用语义之间的区别是Java类型系统最重要的方面之一
我将其设置为number2copy,number2copy=number2
此时,然后(除非您为其中任何一个引用指定了不同的值)number2copy
和number2
指向同一数组。通过一个引用更改阵列时,这些更改通过另一个引用可见
我如何分解这些东西,使其中一个的变化不会导致另一个的变化?它们是不相关的数组,因此需要单独处理
好的,如果它们是不相关的数组,那么您不应该执行number2copy=number2
。。。因为这使它们成为相同的数组
如果要将二维阵列归零,需要执行以下操作:
for (int i = 0; i < toBeZeroed.length; i++) {
for (int j = 0; j < toBeZeroed[i].length; j++) {
toBeZeroed[i][j] = 0;
}
}
for (int i = 0; i < from.length; i++) {
for (int j = 0; j < from[i].length; j++) {
to[i][j] = from[i][j];
}
}
for(int i=0;i
如果要将二维阵列复制到另一个阵列,需要执行以下操作:
for (int i = 0; i < toBeZeroed.length; i++) {
for (int j = 0; j < toBeZeroed[i].length; j++) {
toBeZeroed[i][j] = 0;
}
}
for (int i = 0; i < from.length; i++) {
for (int j = 0; j < from[i].length; j++) {
to[i][j] = from[i][j];
}
}
for(int i=0;i
(这假设from
和to
数组具有相同的维度,不存在空子数组等)
您可以找到一个第三方库,它可以按照您的要求对阵列进行清零/复制。然而,在您学习的过程中,亲自实现这些将对您有好处,帮助您获得关于Java作品的清晰的心智模型;e、 g.参考赋值,二维数组的真正含义,等等
小心使用clone
复制二维(或更多)阵列:
- 它创建了一个新的数组对象,您似乎希望将一个现有数组中的值复制到另一个现有数组中
- 它只执行浅拷贝;i、 e.新阵列将共享原始阵列的子阵列,并且您将陷入当前试图避免更改一个阵列影响另一个阵列的情况
发布实际代码怎么样?你到底为什么要编写代码的英文描述,而不只是发布代码本身?