有人可以分解这一行,以便我能理解吗?

时间:2013-08-09 12:49:01

标签: java

我无法理解如何在Java中初始化ArrayLists数组,有人可以解释这行代码中发生了什么吗?

edges = (ArrayList<Integer>[]) new ArrayList[nodeCount + 1];

6 个答案:

答案 0 :(得分:6)

让我们逐个地打破它。
edgesArrayList<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>>();

建议阅读: -

Angelika Langer Generic FAQs

答案 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>

数组