主要是这样的:定义一个静态类list,在递归里往list里面放东西,每次放入的东西不一样,但是递归结束后发现list里面的每个元素都是一样的(值都与最后个相同)。代码如下: rescusion 函数里面,temp1 temp2 temp3 赋值方式,只有list.add(temp2) 的时候才出现正确的结果。想了两天了,还没想出原因import java.util.ArrayList;
import java.util.List;
public class Test2 {
private static int[][] intArray;
/**
* @param args
*/
private static List<int[][]> list;
public static void main(String[] args) {
// TODO Auto-generated method stub
list = new ArrayList<int[][]>();
int count=0;
intArray = new int[1][2];;
rescusion(count);
for(int i=0;i<list.size();i++) {
int a[][] = list.get(i);
System.out.print(a[0][0]+",");
}
}
private static void rescusion(int count) {
if(count>10) {
return ;
}
Test2.intArray[0][0] = count;
Test2.intArray[0][1] = count;
// Test2.intArray = {{0,0}};
//list.add(Test2.intArray.clone());
int[][] temp1 = Test2.intArray.clone(); //直接拷贝 ....不能正确的输出值
int[][] temp2 = {{count,count}}; //分配一个新的地址....可以正确的输出值
int[][] temp3 = new int [Test2.intArray.length][2];//分配一个新的地址.....不能正确的输出值
temp3 = Test2.intArray.clone();
list.add(temp2);
//list.add(temp2);
count+=2;
rescusion(count);
}}
import java.util.List;
public class Test2 {
private static int[][] intArray;
/**
* @param args
*/
private static List<int[][]> list;
public static void main(String[] args) {
// TODO Auto-generated method stub
list = new ArrayList<int[][]>();
int count=0;
intArray = new int[1][2];;
rescusion(count);
for(int i=0;i<list.size();i++) {
int a[][] = list.get(i);
System.out.print(a[0][0]+",");
}
}
private static void rescusion(int count) {
if(count>10) {
return ;
}
Test2.intArray[0][0] = count;
Test2.intArray[0][1] = count;
// Test2.intArray = {{0,0}};
//list.add(Test2.intArray.clone());
int[][] temp1 = Test2.intArray.clone(); //直接拷贝 ....不能正确的输出值
int[][] temp2 = {{count,count}}; //分配一个新的地址....可以正确的输出值
int[][] temp3 = new int [Test2.intArray.length][2];//分配一个新的地址.....不能正确的输出值
temp3 = Test2.intArray.clone();
list.add(temp2);
//list.add(temp2);
count+=2;
rescusion(count);
}}
你又没有重载clone方法,自然传的是原来对象的引用啦^_^
Test2.intArray[0][0] = count;
Test2.intArray[0][1] = count;
这里一直在为静态变量赋值,然后呢其他地方时clone,这要是不一样就怪了
因为java中没有二维数组的概念,只有数组的数组。所以二维数组a中存储的实际上是两个一维数组的引用。当调用clone函数时,是对这两个引用进行了复制。
list.add(temp2); 这行代码 ,你把temp2 换成 temp3 或者temp1 试试
int[][] temp1 = Test2.intArray.clone(); //直接拷贝 ....不能正确的输出值
int[][] temp2 = {{count,count}}; //分配一个新的地址....可以正确的输出值
int[][] temp3 = new int [Test2.intArray.length][2];//分配一个新的地址.....不能正确list.add(temp1) 出来的值都是10是因为 java基础类型只认一维数组,二维数组 的clone返回的是引用,每次递归都将引用赋值给了 temp1 所以 list里面装的是引用,而不是值。temp3 虽然也分配了移块内存,但是后来也赋值了一个引用给temp3 ,所以temp3 与temp1 一样。temp2 是另外一块内存,所以输出正常