3

我是 Java 新手,所以我不知道细节。
为什么我不能创建参数化 ArrayList 的通用数组?
相反,我必须写,

ArrayList<String>[] alist = new ArrayList[10]; 

或者我必须创建 ArrayLists 列表。
数组不应该比 ArrayLists 更有效吗?那么为什么Java不允许呢?
另外,以下两行之间有什么区别。

ArrayList<String>[] alist = new ArrayList[10];  
ArrayList<String>[] alist = new ArrayList<?>[10];  
4

4 回答 4

2

实际上 ArrayList 的实现对于不改变列表大小的读写操作非常有效。在许多情况下(至少从 java 1.6 开始),编译器将完全消除方法调用开销(例如 get())。

也没有多少程序需要数组提供的性能,所以在你的代码太慢之前不要担心使用数组(即使那样你可能不需要数组)

于 2010-03-21T18:57:44.347 回答
2

您必须这样做的原因是因为泛型在 Java 中并不真正存在。它实际上是一个编译器黑客

至于您发布的两行,在生成的字节码方面应该没有任何区别。但是,在第一种情况下,您可能会收到警告,因为您的编译器认为您忘记java.util.ArrayList了需要类型参数,而后者不会编译,因为您正在尝试实例化泛型数组。两败俱伤:(

于 2010-03-21T18:37:33.180 回答
1

我还建议创建一个数组列表的数组列表。

ArrayList<ArrayList<Type>> alist = new ArrayList<ArrayList<Type>>();

,其中 Type 是您希望列表成为的任何类型。您现在有一个包含数组列表的数组列表。如果你想添加一个数组列表,你可以这样做:

alist.add(new ArrayList<Type>());
于 2010-03-21T20:08:18.110 回答
1

如果你能做到这一点,这将会发生:

ArrayList<String>[] alist = new ArrayList<String>[10];
Object[] olist = alist;   // This is okay because ArrayList is an Object
olist[0] = new ArrayList<Dog>();
olist[0].add(new Dog());
String s = alist[0].get(0);  //Uh oh, Dog is not string
于 2010-03-21T19:41:11.543 回答