Java 中的奇怪数组行为
Strange array behaviour in Java
我最近一直在做一些 Java 编码,遇到了这个非常奇怪的问题。我在 Java 中写了一个 class,它扩展了 JPanel 并根据其自身的大小调整对象的大小。
为了更好地理解,我将问题简化为尽可能小的代码。
问题是,当我 运行 下面的代码时,它总是不仅会设置 array1[0]
,还会设置 array2[0]
。我不明白为什么 array2
会改变,即使我从未改变过它...
我添加了一些内容以突出显示我认为代码执行的操作,但我看不到。
当我 运行 代码并调整 window 的大小时,打印出的值将快速变化并在稍微移动后变为无穷大。
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Beispiel extends JPanel {
double[] array1, array2;
public Beispiel(double[] array){
array1 = array;
array2 = array;
}
public void repaint(){
try {
array1[0] = array2[0]*this.getWidth();
System.out.println(array2[0]);
// array2[0] = array1[0] <--- what i think it does
} catch(Exception e){
}
}
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setSize(300,200);
frame.setLayout(new BorderLayout());
double[] array = {1.0,3.0};
frame.add(new Beispiel(array));
frame.setVisible(true);
}
}
而不是这样做,
public Beispiel(double[] array){
array1 = array;
array2 = array;
}
尝试这样做并分享结果
public Beispiel(double[] array){
array1 = Arrays.copyOf(array, array.length);
array2 = Arrays.copyOf(array, array.length);
}
array2
确实改变了。当您使用 array1 = array
和 array2 = array
时,您使 array1
和 array2
引用同一个数组。因此,对 array1
所做的任何更改也会反映在 array2
中。
要解决此问题,请使用 java.util.Arrays.copyOf(array, array.length)
或 array.clone()
(但请注意,此 returns 是数组的浅表副本)。
我最近一直在做一些 Java 编码,遇到了这个非常奇怪的问题。我在 Java 中写了一个 class,它扩展了 JPanel 并根据其自身的大小调整对象的大小。
为了更好地理解,我将问题简化为尽可能小的代码。
问题是,当我 运行 下面的代码时,它总是不仅会设置 array1[0]
,还会设置 array2[0]
。我不明白为什么 array2
会改变,即使我从未改变过它...
我添加了一些内容以突出显示我认为代码执行的操作,但我看不到。
当我 运行 代码并调整 window 的大小时,打印出的值将快速变化并在稍微移动后变为无穷大。
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Beispiel extends JPanel {
double[] array1, array2;
public Beispiel(double[] array){
array1 = array;
array2 = array;
}
public void repaint(){
try {
array1[0] = array2[0]*this.getWidth();
System.out.println(array2[0]);
// array2[0] = array1[0] <--- what i think it does
} catch(Exception e){
}
}
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setSize(300,200);
frame.setLayout(new BorderLayout());
double[] array = {1.0,3.0};
frame.add(new Beispiel(array));
frame.setVisible(true);
}
}
而不是这样做,
public Beispiel(double[] array){
array1 = array;
array2 = array;
}
尝试这样做并分享结果
public Beispiel(double[] array){
array1 = Arrays.copyOf(array, array.length);
array2 = Arrays.copyOf(array, array.length);
}
array2
确实改变了。当您使用 array1 = array
和 array2 = array
时,您使 array1
和 array2
引用同一个数组。因此,对 array1
所做的任何更改也会反映在 array2
中。
要解决此问题,请使用 java.util.Arrays.copyOf(array, array.length)
或 array.clone()
(但请注意,此 returns 是数组的浅表副本)。