我是Java的新手,所以我不知道这些细节 为什么我不能创建参数化ArrayList的通用数组? 相反,我必须写,
ArrayList<String>[] alist = new ArrayList[10];
或者我必须创建ArrayLists列表 数组不应该比ArrayLists更有效吗?那为什么Java不允许呢? 另外,以下两行之间有什么区别。
ArrayList<String>[] alist = new ArrayList[10];
ArrayList<String>[] alist = new ArrayList<?>[10];
答案 0 :(得分:2)
您必须这样做的原因是因为泛型在Java中不存在真正。它实际上是compiler hack。
对于您发布的两行,在生成的字节码方面应该没有任何区别。但是,在第一种情况下,您可能会收到警告,因为您的编译器认为您忘记了java.util.ArrayList
想要一个类型参数,而后者将无法编译,因为您正在尝试实例化一个通用数组。失败的情况:(
答案 1 :(得分:2)
实际上,ArrayList的实现对于不改变列表大小的读写操作非常有效。在许多情况下(至少从java 1.6开始),编译器将完全删除方法调用开销(例如对于get())。
同样没有多少程序需要数组提供的性能,因此在代码太慢之前不要担心使用数组(甚至那时你可能不需要数组)
答案 2 :(得分: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
答案 3 :(得分:1)
我还建议创建一个arraylists的arraylist。
ArrayList<ArrayList<Type>> alist = new ArrayList<ArrayList<Type>>();
,其中Type是您希望列表的任何类型。你现在有一个包含数组列表的arraylist。如果你想添加一个arraylist,你可以这样做:
alist.add(new ArrayList<Type>());