创建一个Arraylists数组

use*_*ser 157 java arrays arraylist

我想创建一个如下所示的arraylist数组:

ArrayList<Individual>[] group = new ArrayList<Individual>()[4]
Run Code Online (Sandbox Code Playgroud)

但它没有编译.我怎样才能做到这一点?

MBy*_*ByD 132

根据Oracle文档:

"你无法创建参数化类型的数组"

相反,你可以这样做:

ArrayList<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>(4);
Run Code Online (Sandbox Code Playgroud)

正如汤姆·霍金(Tom Hawting)所说 - 强调,它做得更好:

List<List<Individual>> group = new ArrayList<List<Individual>>(4);
Run Code Online (Sandbox Code Playgroud)

  • `List <List <Individual >> group = new ArrayList <List <Individual >>();`可能会更好. (19认同)
  • 为什么List引用比ArrayList更好? (14认同)
  • 我很惊讶,因为它没有"回答这个问题(即我想这样做,我该怎么办).除了第一句话. (5认同)
  • "无法创建泛型类型"是什么意思?这对我来说真的没有意义,因为如果你提供它的假设,它不是通用的,对吧? (4认同)
  • @shifu列表引用比ArrayList更通用; 声明为List抽象出超出List API的ArrayList的API.这很好,因为它简化了对List的引用,其API可能完全具有List所需的全部内容,而不会使引用的API与附加ArrayList具有混乱.如果您需要通过引用提供其API中的特定内容,则只应将其声明为ArrayList. (3认同)
  • 有什么理由比 @kelvincer 更简单的答案 (`ArrayList&lt;String&gt;[] group = new ArrayList[4]`) 更可取?尤其是如果普通数组 API 就足够了? (2认同)

Mar*_*cus 91

正如其他人提到的那样,使用另一个列表来存储ArrayList可能更好,但是如果必须使用数组:

ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你真的回答了这个问题.没有逻辑上的理由可以自动设定列表比没有更多上下文的数组更可取. (29认同)
  • 似乎没有人解释为什么,我喜欢你上面的代码片段.为什么你建议使用这个列表? (4认同)
  • 如果array*group*没有改变,那么这种方法更好,因为数组比List <>类更快. (3认同)
  • 有什么理由比@kelvincer更可取答(`ArrayList <String> [] group = new ArrayList [4]`)?演员做了什么额外的好事? (3认同)
  • 您应该使用`new ArrayList &lt;?&gt; [N]`以避免使用原始类型。 (2认同)
  • `List&lt;Integer&gt;[]subsets=(List&lt;Integer&gt;[])new ArrayList[length]` 也可以完成这项工作 (2认同)

kel*_*cer 75

这有效:

ArrayList<String>[] group = new ArrayList[4];
Run Code Online (Sandbox Code Playgroud)

  • 这会产生一个警告:`注意:hello.java使用未经检查或不安全的操作.注意:使用-Xlint重新编译:取消选中以获取详细信息 (12认同)

小智 23

您可以创建一个扩展ArrayList的类

class IndividualList extends ArrayList<Individual> {

}
Run Code Online (Sandbox Code Playgroud)

然后创建数组

IndividualList[] group = new IndividualList[10];
Run Code Online (Sandbox Code Playgroud)


sms*_*lce 17

我完全不明白,为什么每个人都在建议阵列的genric类型,尤其是这个问题.

如果我需要索引n不同的arraylists 怎么办?

通过声明List<List<Integer>>我需要n ArrayList<Integer>手动创建对象或者使用for循环创建n列表或其他方式,无论如何,创建n列表始终是我的职责.

如果我们通过铸造声明它是不是很好List<Integer>[] = (List<Integer>[]) new List<?>[somenumber].我认为这是一个很好的设计,人们不必自己创建所有的索引对象(arraylists)

任何人都可以告诉我为什么这个(arrayform)将是一个糟糕的设计,它的缺点是什么?


Arj*_*ndy 13

您可以创建Array of ArrayList

List<Integer>[] outer = new List[number];
for (int i = 0; i < number; i++) {
    outer[i] = new ArrayList<>();
}
Run Code Online (Sandbox Code Playgroud)

这在这样的场景中会有所帮助.你知道外面的大小.但内在的大小各不相同.在这里,您可以创建一个固定长度的数组,其中包含大小变化的数组列表.希望这对你有所帮助.

Java 8及更高版本中,您可以以更好的方式完成它.

List<Integer>[] outer = new List[number];
Arrays.setAll(outer, element -> new ArrayList<>());
Run Code Online (Sandbox Code Playgroud)

甚至更好地使用方法参考

List<Integer>[] outer = new List[10];
Arrays.setAll(outer,  ArrayList :: new);
Run Code Online (Sandbox Code Playgroud)


Ric*_*ich 8

这工作,ArrayList数组.尝试了解它是如何工作的.

import java.util.*;

public class ArrayOfArrayList {
    public static void main(String[] args) {

        // Put the length of the array you need
        ArrayList<String>[] group = new ArrayList[15];
        for (int x = 0; x < group.length; x++) {
            group[x] = new ArrayList<>();
        }

        //Add some thing to first array
        group[0].add("Some");
        group[0].add("Code");

        //Add some thing to Secondarray
        group[1].add("In here");

        //Try to output 'em
        System.out.println(group[0]);
        System.out.println(group[1]);
    }
}
Run Code Online (Sandbox Code Playgroud)

Kelvincer对部分代码的信用.


Mar*_*dey 6

这种情况的问题是通过使用arraylist你会得到o(n)的时间复杂度,以便在特定位置添加.如果使用数组,则通过声明数组来创建内存位置,因此它是常量

  • 在特定位置添加数组的O(1).它对于ArrayList是O(n),但对于数组是O(1). (2认同)