Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Intellij Idea_Variable Assignment_Skip - Fatal编程技术网

Java中难以解释的数组分配行为

Java中难以解释的数组分配行为,java,arrays,intellij-idea,variable-assignment,skip,Java,Arrays,Intellij Idea,Variable Assignment,Skip,就这样。我一直在为一个更大的项目构建一个软件,而现在,我对Java处理代码的方式感到困惑。我完全不知道为什么Java会像现在这样运行 它似乎跳过了我的部分代码,并在没有调用相应的方法时将值分配给不同的数组。 我已经用IntelliJ调试器仔细检查了这几个小时,但是我没有找到一个原因来解释为什么事情会这样发生 package com.whatareyoudoing.java; import java.util.Arrays; /** * WHAT THE ACTUAL DUCK */ pub

就这样。我一直在为一个更大的项目构建一个软件,而现在,我对Java处理代码的方式感到困惑。我完全不知道为什么Java会像现在这样运行

它似乎跳过了我的部分代码,并在没有调用相应的方法时将值分配给不同的数组。

我已经用IntelliJ调试器仔细检查了这几个小时,但是我没有找到一个原因来解释为什么事情会这样发生

package com.whatareyoudoing.java;
import java.util.Arrays;

/**
 * WHAT THE ACTUAL DUCK
 */
public class WTF {
    private int[] number;
    private int[] oldNumber;

    public WTF() {
        number = new int[1];
        oldNumber = new int[1];
    }

    public void putNumber(int c) {
        number[0] = c;
    }

    public void putOld() {
        if(Arrays.equals(oldNumber, number)) {
            System.out.println("Nothing to do!");
            return; //How on earth can they literally be the same?!
        }
        oldNumber = number;
    }

    public void doWTF() {
        putNumber(1); 
        putOld(); // Works.
        putNumber(2); // Expected Result: number = 2; oldNumber = 1 [NOPE] number = 2; oldNumber = 2
        putOld(); // [NOPE] Simply Skips with "Nothing to do"
        putNumber(3); // Same odd behaviour
        putOld(); // Aaaand skips again.
    }
}
在第一次调用putNumber后,再次使用
putNumber
同时将值放入两个变量(
oldNumber
Number
)中,而不是只放入
Number[0]

我继续尽可能地简化我的代码,因此这个示例更易于实践。很明显,我发现这个实例的数组比单个元素长

我还使用多维数组和对象数组对其进行了测试。行为没有改变


我现在完全迷惑不解,完全不知道如何继续下去。如果你能对这个话题有所帮助,请这样做。我非常困惑。

以下作业说明:

    oldNumber = number;
使
oldNumber
number
指向相同的基础数组。也许你想要的是复制一份:

    System.arraycopy(number, 0, oldNumber, 0, number.length);

有关完整的详细信息,请参阅。

这一行的功能与您认为的不同

oldNumber = number;
它不是将一个数组的内容复制到另一个数组。它使引用变量
oldNumber
引用与
number
引用的数组对象相同的数组对象

oldNumber ----> [1]
number    -------^
因此,通过任何一个变量进行的任何更改都会写入同一个数组,并且可以通过引用同一数组的两个引用看到更改

然后稍后调用
数组。equals
并引用同一数组,因此它们是“相等”的

您想用此行复制号码:

oldNumber[0] = number[0];
当你分配

oldNumber = number
不复制数组中的值
oldNumber
将指向完全相同的数组(其中一个变量的未来变化将反映在另一个变量中)

你可以用它复印一份

oldNumber = Arrays.copyOf(number, number.length);

在putOld函数中,您将第一个数组的引用指定给了另一个数组。第一次调用后,oldNumber是指向number的指针,如果您更改其中一个值,则另一个也会受到影响


如果要复制值System.arraycopy()

,那么将一个数组的值分配给另一个数组的正确方法是什么?谢谢你的快速回答!