我有一个名为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();
但这不是我真正想要的。有没有更有效/更好的方法呢?
答案 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
提供的无限的对象流,MyObject
是limit(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()};