1.创建一个对象数组
我们创建一个引用数据类型的数组必须先进行初始化,即对元素经行实例化。否则数组里的元素都是null。
代码验证:
public class Main {
public static void main(String[] args) {
//创建 引用 数据类型的数组
ArrayList<Integer>[] lists = new ArrayList[10];
System.out.println(Arrays.toString(lists));
}
}
输出结果:
正确的初始化方法:
public class Main {
public static void main(String[] args) {
//创建 引用 数据类型的数组
ArrayList<Integer>[] lists = new ArrayList[10];
//初始化
for (int i = 0; i < lists.length; i++) {
lists[i] = new ArrayList<>();
}
System.out.println(Arrays.toString(lists));
}
}
输出结果:
2.使用 Arrays.fill()遇到的问题
这是我就想到能不能用Arrays.fill()方法呢?这样会不会比for循环更优雅。我就将for循环改成了Arrays.fill()。结果就出问题了。
问题:使用Arrays.fill()方法初始化的对象数组,里面的每个元素都是同一个对象,意思就是说改变list[0]的值,list[1]的值也会变。
代码验证:
public class Main {
public static void main(String[] args) {
//创建 引用 数据类型的数组
ArrayList<Integer>[] lists = new ArrayList[10];
//这是错误的初始化方法
Arrays.fill(lists,new ArrayList<Integer>());
//给第一个元素加上值
lists[0].add(2);
System.out.println(Arrays.toString(lists));
}
}
结果输出:
可以看到,我们只改变了list[0]的值,但是其他的值也变了。
我们使用debug调试一下,发现数组里面的元素都是同一个对象,即同一个地址,这样改一个值其他元素的值当然也会跟着改变。(也可以使用hashCode验证是不是同一个对象)
总结:
不能使用Arrays.fill()初始化引用对象数组,因为使用这样得到的数组里的元素是同一个,要使用for循环初始化。