java - 如何使用 fill() 方法填充 Java 中特定对象的多维数组?

标签 java arrays methods multidimensional-array fill

展示代码比谈论它更容易。我还在互联网上搜索了答案,但找不到任何答案,所以这是我的代码:

http://pastebin.com/M606mXzR

我还添加了一个输出,位于第 50-70 行。 61-70 的输出是“正确”的,也是我想要的。

我使用 fill() 方法是错误的还是什么?我无法理解这个...

真的有区别吗?

ClassB[][] classB_2Array = new ClassB[10][10];

在此之间:

for (ClassB[] classB_1Array : classB_2Array) {
            Arrays.fill(classB_1Array, new ClassB());
}

对此:

for (int i = 0; i < classB_2Array.length; i++) {
    for (int j = 0; j < classB_2Array[0].length; j++) {
        classB_2Array[i][j] = new ClassB();
    }
}

无论如何,请查看我的代码并感谢大家的回答!

最佳答案

回答您的问题:是的,有区别(请参阅 JavaDoc)。

您的第一个版本将一个对象实例放入一行的每个数组元素中。因此,对此实例的更改在数组同一行中的每个元素中都是可见的。您总共将拥有 iClassB 个实例。

第二个版本将自己的实例放入每个数组元素中。您总共将拥有 i*j ClassB 个实例。

您的代码的第一个版本相当于

for (ClassB[] classB_1Array : classB_2Array) {
    ClassB instance = new ClassB();
    Arrays.fill(classB_1Array, instance);
}

希望这些信息对您有所帮助,我没有查看您的pastebin代码。

编辑:

为了澄清您的误解,请仔细查看该程序的输出:

import java.util.Arrays;

public class ArrayFiller {
    public static void main(String[] args) {
        // your first version:
        Person[][] yourFirstVersion = new Person[2][2];
        for (Person[] array : yourFirstVersion) {
            Arrays.fill(array, new Person("Mike"));
        }
        System.out.println(Arrays.deepToString(yourFirstVersion));
        yourFirstVersion[0][1].setName("Paul");
        System.out.println(Arrays.deepToString(yourFirstVersion));
        System.out.println("-----");
        // equivalent: my version:
        Person[][] myVersion = new Person[2][2];
        for (Person[] array : myVersion) {
            Person person = new Person("John");
            Arrays.fill(array, person);
        }
        System.out.println(Arrays.deepToString(myVersion));
        myVersion[0][1].setName("Thomas");
        System.out.println(Arrays.deepToString(myVersion));
        System.out.println("-----");
        // your second version
        Person[][] yourSecondVersion = new Person[2][2];
        for (int i = 0; i < yourSecondVersion.length; i++) {
            for (int j = 0; j < yourSecondVersion[i].length; j++) {
                yourSecondVersion[i][j] = new Person("Max");
            }
        }
        System.out.println(Arrays.deepToString(yourSecondVersion));
        yourSecondVersion[0][1].setName("Chris");
        System.out.println(Arrays.deepToString(yourSecondVersion));
    }

    private static class Person {
        private String name;
        public Person(String name) {
            System.out.println("Constructor called for " + name);
            this.name = name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return name;
        }
    }
}

这是输出:

Constructor called for Mike
Constructor called for Mike
[[Mike, Mike], [Mike, Mike]]
[[Paul, Paul], [Mike, Mike]]
-----
Constructor called for John
Constructor called for John
[[John, John], [John, John]]
[[Thomas, Thomas], [John, John]]
-----
Constructor called for Max
Constructor called for Max
Constructor called for Max
Constructor called for Max
[[Max, Max], [Max, Max]]
[[Max, Chris], [Max, Max]]

关于java - 如何使用 fill() 方法填充 Java 中特定对象的多维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14093685/

相关文章:

java - 数组问题 我不断收到编译错误

java - 在没有 "losing my place"的情况下,如何访问迭代器之外的 java 集合中的元素?

java - 如何使用java selenium点击jsp页面中vue js渲染的按钮

javascript - 如何动态显示数组的数组?

python - 检查某列的值是否位于 pandas 数据框中的另一个列数组中

Java - 如何在泛型类中调用我的类 T 的方法

python - 使用字典来控制方法的流程

java - 冒泡排序法+里面的排列法

java - 选择文本需要 XPath 建议

java - 如何使 JTable 内的 JPanel 内的组件可编辑?