我无法理解如何在Java中初始化ArrayLists数组,有人可以解释这行代码中发生了什么吗?
edges = (ArrayList<Integer>[]) new ArrayList[nodeCount + 1];
答案 0 :(得分:6)
让我们逐个地打破它。
edges
是ArrayList<Integer>[]
类型的变量
=
是赋值运算符,它将右手赋予左手
(ArrayList<Integer>[])
是该类型变量的强制转换
new ArrayList[nodeCount + 1]
表示我们为具有ArrayList
个未知元素的nodeCount+1
数组分配空间。
这是初始化数组的一种非常糟糕的方法。它的作用是创建一个数组并使元素成为整数。
替代方案:
edges = new ArrayList<Integer>(nodeCount+1);
说明: ArrayList
类有一个构造函数可以指定它的长度*,这就是我在这里使用的。
注意:根据@Rohit Jain,它没有指定长度,而是指定初始容量。
答案 1 :(得分:3)
您无法创建其组件类型为参数化类型的数组。它不是类型安全的。虽然您可以创建一个组件类型为原始类型的数组,但这也不是类型安全的。请考虑以下示例:
List<Integer>[] list = null; // Declaration is OK
list = new ArrayList<Integer>[5]; // Compiler error: Generic array creation
list = new ArrayList[5]; // Compiles fine. But not safe. Gives warning
假设您创建了一个原始类型数组。让我们看看可能是什么意思:
List<Integer>[] list = new ArrayList[10]; // Not type safe
Object[] objArr = list; // We can assign List<Integer>[] to Object[]
// We can add even ArrayList<String> in Object[]
// This will successfully compile, and run.
objArr[0] = new ArrayList<String>() {
{
add("rohit"); add("jain");
}
};
// Here's the problem. It will compile fine, but at runtime will throw
// ClassCastException
Integer val = list[0].get(0);
替代方案是创建List
List
:
List<List<Integer>> edges = new ArrayList<List<Integer>>();
建议阅读: -
答案 2 :(得分:1)
在上面一行中,您要创建一个ArrayList
数组,可以用更简单的类型替换ArrayList
,以帮助您理解,例如一个String数组:
edges = (String[]) new String[nodeCount + 1];
nodeCount + 1
对应于数组的大小。该数组的元素数不能超过这个数量。
请注意,使用参数化ArrayList
的数组非常奇怪,容易产生误解和错误。我会在这里使用List<List<Integer>>
,例如:
edges = new ArrayList<List<Integer>>();
答案 3 :(得分:1)
这一行定义了一个数组,就像那里的任何其他数组一样:例如new Object[0]
,new String[0]
,...
,就像任何其他数组一样,值将以null值启动。对于原始类型,对象/类的'0'是null
。
所以你应该在使用之前启动不同的arraylists,如:
edges = new ArrayList<Integer>[nodeCount + 1];
for(int i=0; i<edges.length; i++){
edges[i] = new ArrayList<Integer>();
}
答案 4 :(得分:1)
这不初始化一个ArrayList - 它初始化一个 ArrayLists数组:
new ArrayList[nodeCount + 1]
=使用ArrayList
个插槽创建nodeCount + 1
个对象数组(ArrayList<Integer>[])
=将其投放到“ArrayList
个对象的数组中,而这些对象又可能只包含Integer
个对象”。这是必需的,因为java的数组声明语法显然无法处理泛型(只是尝试过它 - 我之前从未需要它)。它可能是一种误解,作者实际上想要初始化一个容量为ArrayList
的{{1}}。正确的代码是
nodeCount+ 1
实际上,容量参数只是一种优化,因为edges = new ArrayList<Integer>(nodeCount + 1);
对象会根据需要自动增长。但是,如果您已经知道需要多少条目,则可以从一开始就创建具有足够容量的列表。
答案 5 :(得分:0)
new ArrayList[nodeCount + 1]
创建一个新的ArrayList数组,其长度为nodeCount + 1;
然后
(ArrayList<Integer>[])
是一个强制转换操作,它将您刚刚创建的数组强制转换为ArrayList<Integer>