【问题标题】:How to fill multidimensional array of specific objects in Java with fill() method?如何使用 fill() 方法填充 Java 中特定对象的多维数组?
【发布时间】:2012-12-15 03:30:01
【问题描述】:

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

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

不管怎样,看看我的代码,谢谢大家的回答!

【问题讨论】:

    标签: java arrays methods multidimensional-array fill


    【解决方案1】:

    回答你的问题:是的,有区别(见JavaDoc)。

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

    第二个版本将它自己的实例放入每个数组元素中。您总共将拥有 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]]
    

    【讨论】:

    • 非常感谢您的快速回答! “将指定的对象引用分配给指定的对象数组的每个元素。”当然......“对象参考”。我以为我做了一个“新”对象,当指定新对象时:Arrays.fill(array, new Object);
    • 我没有检查答案,因为我仍然想知道为什么 Arrays.fill(array, new object()) 不起作用。我的意思是,我在那里指定了一个新关键字,所以它应该创建一个新对象,而不是引用预制的东西。
    • 查看我回答中的代码示例。 new 使用该方法调用一次,构造函数返回的引用就像我的代码示例一样使用。主要事实是:new 在您的第一个版本中仅被调用一次,如我的代码示例中所示。
    • @Furlando 查看我添加到帖子中的示例程序和输出。
    • 因为该方法的目的不是表现得像预期的那样,所以它表现得像记录的那样。如果您使用不可变类型并希望使用默认值填充数组并稍后仅更改一些索引,则该方法是有意义的。
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多