Java中难以解释的数组分配行为
就这样。我一直在为一个更大的项目构建一个软件,而现在,我对Java处理代码的方式感到困惑。我完全不知道为什么Java会像现在这样运行 它似乎跳过了我的部分代码,并在没有调用相应的方法时将值分配给不同的数组。 我已经用IntelliJ调试器仔细检查了这几个小时,但是我没有找到一个原因来解释为什么事情会这样发生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
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(),那么将一个数组的值分配给另一个数组的正确方法是什么?谢谢你的快速回答!