Arrays.fill和实际填充之间是否存在差异?

时间:2016-03-19 05:47:42

标签: java arrays

这个问题可能看似微不足道,但我几天都找不到解决这个问题的方法。

摘录1:

for(int i = 0; i < arr.length; i++){
    arr[i] = new Bucket();
}

摘录2:

Arrays.fill(arr, new Bucket());

带有代码段1的代码正在按预期执行,但包含代码段2的代码未通过所有测试用例。

我期待这两个陈述在内部做同样的工作。但是测试用例表明它不是。任何帮助澄清这一点都会非常有帮助。

3 个答案:

答案 0 :(得分:4)

考虑一下他们做了什么:在循环中,您在每次迭代中创建一个新对象 。在第二步中,您创建一个对象并用它填充数组。他们是完全不同的。

来自documentation

  

将指定的Object引用分配给指定的Objects数组的每个元素。

答案 1 :(得分:1)

Arrays.fill()始终使用相同的对象:

public static void fill(Object[] a, Object val) {
    for (int i = 0, len = a.length; i < len; i++)
        a[i] = val;
}

因此,整个数组将被new Bucket()

创建一次的单个实例填充

答案 2 :(得分:0)

  

我期待这两个陈述在内部做同样的工作。

Snippet 2仅创建一个Bucket,并将相同的实例添加到每个插槽。所以它们不一样,在Java 8+中你可以使用lambda和类似

的东西
IntStream.range(0, arr.length).forEach(x -> arr[x] = new Bucket());

填写Bucket[] arr