今天做八皇后算法的时候发现list保存的所有的解都是7开头的,而且完全一样。调试了好久才发现可能是引用的问题,特别是static修饰的变量容易出现这个问题,亏我前几天面试还被问到了java的引用问题。
解决办法是调用list 的add方法体里使用对象的clone方法
list.add(chars.clone());
示例代码如下
List<String[]> list = new LinkedList<String[]>();
String[] strs = new String[1];
for(int i = 0; i < 3; i++){
strs[0] =String.valueOf(i);
list.add(strs);
}
for(int i = 0; i < 3; i++){
System.out.println( list.get(i)[0]);
}
期望输为0,1,2 但实际输出为
2
2
2
因为加入的是它的引用的地址,所以至始至终都是对同一个数组对象操作,list中的所有元素都是最后一次更新的数组对象。所以输出都为 2。
正确的写法应该是:,
List<String[]> list = new LinkedList<String[]>();
for(int i = 0; i < 3; i++){
// String[] strs = new String[1]; 1.在这里new 对象 每次都更新引用。
strs[0] =String.valueOf(i);
list.add(strs.clone()); //或者2. 在这里使用 clone()方法,
// 拿到就是不是原对象的引用了,而是一新对象,
//不会随着算法进行而改变
}
for(int i = 0; i < 3; i++){
System.out.println( list.get(i)[0]);
}
只有每次都新建一个新的数组,才能够保存想要的数据