Java 为什么更改二维数组中的一个条目会更改整个列?

Java 为什么更改二维数组中的一个条目会更改整个列?,java,arrays,Java,Arrays,为什么会这样?我不明白。为什么要更改整个列而不是单个条目 如何在不以不同方式初始化2D数组的情况下仅更改一个条目?可能吗 为什么要更改整个列而不是单个条目 因为每一行的每一列都是存储在堆上同一个数组对象中的元素,而使用ones引用的数组中的元素的更改将在引用(或将引用)同一数组实例的每个其他变量中反映该更改 intone=1; int[]one={one,one,one}//创建1D数组`{1,1,1}` int[]lotsofones={one,one,one}//重用相同的“一”数组,并将对

为什么会这样?我不明白。为什么要更改整个列而不是单个条目

如何在不以不同方式初始化2D数组的情况下仅更改一个条目?可能吗

为什么要更改整个列而不是单个条目

因为每一行的每一列都是存储在堆上同一个数组对象中的元素,而使用
ones
引用的数组中的元素的更改将在引用(或将引用)同一数组实例的每个其他变量中反映该更改

intone=1;
int[]one={one,one,one}//创建1D数组`{1,1,1}`
int[]lotsofones={one,one,one}//重用相同的“一”数组,并将对象放入“一”二维数组的三个索引中
因此,改变:

lotsofones[0][1]=2;
更改一个数组对象中的条目,该对象被引用三次


如何在不以不同方式初始化2D数组的情况下仅更改一个条目?可能吗

当然可以。只需创建二维数组,不必为该二维数组的每个元素使用相同的数组对象。其中一种方式如下所示:

intone=1;
int size=3;
int[]lotsofones=新的int[size][size];
对于(int i=0;i
那么

for(int[]数组:lotsofones){
for(int num:array){
系统输出打印(num+“”);
}
System.out.println();
}
将输出:

//main method
int one = 1;
int[] ones = {one, one, one};
int[][] lotsofones = {ones, ones, ones};
lotsofones[0][1] = 2;
for (int[] array : lotsofones) {
  for (int num : array) {
    System.out.print(num + " ");
  }  
  System.out.println();
}
/*
Expected output:
1 2 1 
1 1 1
1 1 1 

Actual output:
1 2 1
1 2 1 
1 2 1 
*/


正因为如此:
int[]lotsofones={one,one,one}。每个索引都包含对
索引的完全相同的引用。
1 2 1 
1 1 1 
1 1 1