当我们使用Java编程语言时,或许有创建多维数组并绑定其中的若干个子数组的需求。
总结:java的数组相对C++语言的数组在使用时有较大的优势,一方面是可以直接通过.length获取数组长度,并伴有数组越界检查;另一方面是,可以直接将一个数组赋值给另一个数组,尽管是通过引用(指针)模式。
比如在C++中
int a[2][2] = {{1,2},{2,1}};
int b[] = {1,1};
a[0] = b;
被认为是非法的。
for(T a, T[])
for循环的foreach版本,实际上作用类似于将 T中的每一个元素作为值分别传给a。
比如我们想要绑定一个二维数组中 所有一维数组。
即改变 c[0][0]那么c[1][1]也会被绑定改变。你或许想要尝试使用foreach循环来修改。
class ArrayTester{
public static void mainFunction(){
int[] b = new int[]{1,2,3};
int[][] c = new int[2][3];
for(int[] i: c){
i = b;
}
c[0][0] = 100;
for(int[] p: c){
for(int l: p){
System.out.println(l);
}
}
}
}
public class Q2 {
public static void main(String[] args){
ArrayTester.mainFunction();
}
}
输出:0 0 0 100 0 0
很显然,并不起作用,我们尝试输出 数组指针
class ArrayTester{
public static void mainFunction(){
int[] b = new int[]{1,2,3};
int[][] c = new int[2][3];
System.out.println(b);
for(int[] i: c){
System.out.println("$"+i);
i = b;
System.out.println(i);
}
System.out.println("\n");
c[0][0] = 100;
for(int[] p: c){
System.out.println(""+p);
for(int l: p){
System.out.println(l);
}
}
}
}
public class Q2 {
public static void main(String[] args){
ArrayTester.mainFunction();
}
}
输出:
[I@6f496d9f
$[I@1d81eb93
[I@6f496d9f
$[I@7291c18f
[I@6f496d9f
[I@1d81eb93
100
0
0
[I@7291c18f
0
0
0
发现循环内 i 指向的地址确实发生了改变。为什么不起作用呢?
较为完备的分析是:
对于一个foreach循环,对于原本二维数组的第一维数组的地址被直接赋值给了,循环 变量 i,但是 i 并不是代表原本数组的指针。
就像是
for(int k = 0; k < c.length;k++){
int[] i = c[k];
i = b;
}
i的改变并不会改变原来c数组中的 一维指针
于是我们尝试通过直接通过i对从c的引用,改变c中的元素。
class ArrayTester{
public static void mainFunction(){
int[] b = new int[]{1,2,3};
int[][] c = new int[2][3];
System.out.println(b);
for(int[] i: c){
System.arraycopy(b, 0, i, 0, i.length);
}
System.out.println("\n");
c[0][0] = 100;
for(int[] p: c){
for(int l: p){
System.out.println(l);
}
}
}
}
public class Q2 {
public static void main(String[] args){
ArrayTester.mainFunction();
}
}
输出:
100
2
3
1
2
3
这已经符合我们的代码编写预期。
但是如何才能关联元素呢?只需要修改一维数组指针,但不是通过foreach循环。
class ArrayTester{
public static void mainFunction(){
int[] b = new int[]{1,2,3};
int[][] c = new int[2][3];
System.out.println(b);
for(int p = 0; p < 2; p++){
c[p] = b;
}
System.out.println("\n");
c[0][0] = 100;
for(int[] p: c){
for(int l: p){
System.out.println(l);
}
}
}
}
public class Q2 {
public static void main(String[] args){
ArrayTester.mainFunction();
}
}
输出:
100
2
3
100
2
3
符合预期。
进而,通过c[0] = c[1]也可绑定从c[0]数组和c[1]数组