Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java数组总是相等的_Java_Arrays_Hyperlink_Zero - Fatal编程技术网

Java数组总是相等的

Java数组总是相等的,java,arrays,hyperlink,zero,Java,Arrays,Hyperlink,Zero,我有一个二维数组2。我将其设置为number2copy,number2copy=number2 然后,我调用一个归零的方法,将2d数组传递给它ToBeZeroed。这个方法用0填充数组,我知道它是有效的。它返回到满是零的状态。但是,当我把数字2=托比塞勒厄德; number2copy也用零填充。我如何分解这些东西,使其中一个的变化不会导致另一个的变化?它们是不相关的数组,因此需要单独处理< /p> < p> java不是C++。将引用复制到属性为第一个维度的数组,而不是数组对象和数组子对象。您需

我有一个二维数组2。我将其设置为number2copy,number2copy=number2 然后,我调用一个归零的方法,将2d数组传递给它ToBeZeroed。这个方法用0填充数组,我知道它是有效的。它返回到满是零的状态。但是,当我把数字2=托比塞勒厄德;
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.新阵列将共享原始阵列的子阵列,并且您将陷入当前试图避免更改一个阵列影响另一个阵列的情况


发布实际代码怎么样?你到底为什么要编写代码的英文描述,而不只是发布代码本身?