【问题标题】:Filling array of Java objects in initialization在初始化时填充 Java 对象数组
【发布时间】:2013-10-01 11:48:11
【问题描述】:

我有一个名为List 的已实现数据结构(它是一个单链表)。我的 Java 程序中有以下代码:

List[] Adjacent = new List[N]; // Trying to create an array of N List objects

假设 N = 6。我希望 Adjacent 是一个包含六个元素的数组,其中每个元素都是 List 对象本身。但是当我尝试访问它时,该数组实际上是一个包含 N 个空引用的数组。怎么回事?

当然我做了以下来解决我的问题:

for (int p = 0; p < N; p++) 
    Adjacent[p] = new List();

但这不是我真正想要的。有没有更有效/更好的方法?

【问题讨论】:

  • 我会避免使用类名List。它是一个广泛使用的接口的名称...
  • 没有“空对象”这样的东西。
  • @Ingo 将其更正为“指针”
  • @rodrigoalves 对“引用”正确,Java 没有指针。

标签: java arrays oop initialization


【解决方案1】:

当你有

List list;

这是一个引用,而不是一个对象。要拥有一个对象,您必须使用new List(...) 创建一个对象。没有办法解决这个问题。您必须初始化对实际对象的引用。

另外,创建一个与已经内置的东西名称相似的类做同样的事情要糟糕得多。我建议你使用这样的列表列表:

List<List<String>> listofLists = new ArrayList<>();
for(int i = 0; i < N; i++) listOfLists.add(new ArrayList<>());

重用现有类对您来说效率更高。

【讨论】:

    【解决方案2】:

    使用 Java 8 会有一个“不错”的方法:

    MyObject[] array=Stream.generate(MyObject::new).limit(N).toArray(MyObject[]::new);
    

    Stream.generate(MyObject::new) 将创建由Supplier 提供的无限对象流,这是MyObject 在我们的例子中的默认构造函数,limit(N) 显然限制了对象的数量,toArray(MyObject[]::new) 将对象存储到一个由IntFunction&lt;A[]&gt; 构造的数组,它使用指定的int 构造一个数组,在我们的例子中,new MyObject[i] 设置为等价物。该流将为 i 参数提供限制 N

    虽然最后一部分并不是的真正精神。通常,您会将流定向到处理对象的消费者并完全省略数组。

    【讨论】:

      【解决方案3】:

      不。创建新数组后,您应该手动填充它。当然我们有Arrays.fill(array, object) 方法,但它会将同一个对象设置到数组中的所有位置。

      【讨论】:

        【解决方案4】:

        假设 N 总是 6 ...

        List[] l = new List[]{new List(),new List(),
               new List(),new List(),new List(),new List()};
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-29
          • 1970-01-01
          • 2014-11-23
          • 1970-01-01
          • 1970-01-01
          • 2018-06-22
          • 1970-01-01
          相关资源
          最近更新 更多