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

如何用fill()方法填充Java中特定对象的多维数组?,java,arrays,methods,multidimensional-array,fill,Java,Arrays,Methods,Multidimensional Array,Fill,显示代码比谈论代码更容易。我也在互联网站上搜索答案,但没有找到答案,所以我的代码如下: 我还添加了一个输出,位于第50-70行。61-70的输出是正确的,就是我想要的 我使用的填充方法是错误的,还是什么?不能让我的头围绕着这个 真的有区别吗 ClassB[][] classB_2Array = new ClassB[10][10]; 在此之间: for (ClassB[] classB_1Array : classB_2Array) { Arrays.fill(clas

显示代码比谈论代码更容易。我也在互联网站上搜索答案,但没有找到答案,所以我的代码如下:

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

我使用的填充方法是错误的,还是什么?不能让我的头围绕着这个

真的有区别吗

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();
    }
}
不管怎样,只要看看我的代码,谢谢大家的回答

回答你的问题:是的,有区别,请看

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

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

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

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;
        }
    }
}
对你的问题的回答:是的,有区别,请看

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

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

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

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;
        }
    }
}

非常感谢您的快速回答!将指定的对象引用指定给指定对象数组的每个元素。当然对象引用。当指定new时,我想我创建了一个新对象:Arrays.fillarray,new object;我取消了对答案的检查,因为我仍然想知道为什么Arrays.fillarray,新对象无法工作。。我的意思是,我在那里指定了一个新的关键字,所以它应该创建一个新的对象,而不是引用预先制作的东西。new使用该方法调用一次,构造函数返回的引用与我的代码示例中的一样。主要事实是:在您的第1个版本中,new只被调用一次,就像在我的代码示例中一样。@Furlando请看一下我添加到我的文章中的示例程序和输出。由于该方法的目的不是像预期的那样运行,所以它的运行方式与文档中的一样。如果您使用不可变类型,并且希望用默认值填充数组,并且以后只更改一些索引,那么该方法是有意义的。非常感谢您的快速回答!将指定的对象引用指定给指定对象数组的每个元素。当然对象引用。当指定new时,我想我创建了一个新对象:Arrays.fillarray,new object;我取消了对答案的检查,因为我仍然想知道为什么Arrays.fillarray,新对象无法工作。。我的意思是,我在那里指定了一个新的关键字,所以它应该创建一个新的对象,而不是引用预先制作的东西。new使用该方法调用一次,构造函数返回的引用与我的代码示例中的一样。主要事实是:在您的第1个版本中,new只被调用一次,就像在我的代码示例中一样。@Furlando请看一下我添加到我的文章中的示例程序和输出。由于该方法的目的不是像预期的那样运行,所以它的运行方式与文档中的一样。如果您使用不可变类型,并且希望用默认值填充数组,并且以后只更改一些索引,那么该方法是有意义的。