在初始化中填充Java对象数组

时间:2013-10-01 11:48:11

标签: java arrays oop initialization

我有一个名为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();

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

4 个答案:

答案 0 :(得分:3)

当你有

List list;

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

另外,创建一个类似于已经内置的类似名称的类更糟糕。我建议你像这样使用List of List:

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

重用现有类更有效。

答案 1 :(得分:2)

使用Java 8将有一个“很好”的方法:

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

Stream.generate(MyObject::new)将创建由Supplier提供的无限的对象流,MyObjectlimit(N)的默认构造函数,toArray(MyObject[]::new)显然限制了对象的数量和IntFunction<A[]>会将对象存储到由int构造的数组中,该数组使用指定的new MyObject[i]构造数组,在我们的示例中,N设置为等效i。该流将为{{1}}参数提供限制{{1}}。

虽然最后一部分不是 streams 的真正精神。通常,您可以将流引导到处理对象的使用者并完全省略该数组。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

假设N 始终 6 ...

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