有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

arraylist如何用Java表示未知大小元素的已知大小集?

所以我有256个元素(长度未知的列表),我想用Java来表示它们。 在c++中,我会使用如下内容:

vector<int> aList[255];//This is C++ example

在Java中,我尝试使用:

ArrayList<Integer>[] aList = new ArrayList<Integer>[256];

但是Java编译器禁止“通用数组创建”

我还尝试使用:

ArrayList<ArrayList<Integer>>  bList = new ArrayList<>(256);

但当我这么做的时候

bList.get(67) //or any other value

我得到了一个索引越界异常(bList大小为0),所以我的问题是如何最好地表示这样的数据,还是应该用空值(本例中为256个空值)填充bList

编辑:好的,根据答案,我想我会使用解决方案

ArrayList<ArrayList<Integer>>  bList = new ArrayList<>(256);

然后用new ArrayLiist()填充外部数组,因为我需要按不知道的顺序对它进行迭代


共 (5) 个答案

  1. # 1 楼答案

    不能像那样实例化泛型类型的数组。最好的选择是2D阵列:

    Integer[][] aArray = new Integer[256][];
    

    如果需要使用List<Integer>[],则可以通过创建自己的非泛型子类来规避限制:

    class IntList extends ArrayList<Integer> {}
    ...
    ArrayList<Integer>[] aList = new IntList[256];
    

    只需注意,使用此选项无法将new ArrayList<Integer>()添加到aList(数组存储异常),因此必须创建new IntList()对象

  2. # 2 楼答案

    列表是可调整大小的数组。你不必(但你可以)声明初始大小——它们会根据需要增长,只需添加元素即可

    既然你已经在C++中使用了数组,你可以在java EG/<

    int[] yourArray=new int[256];
    

    然后像^{一样访问它

    至于列表,您必须首先初始化它们(也称为添加元素),因为它们会跟踪您添加到它们中的内容。要做到这一点,你可以

    for(int i=0;i<size;i++){
        myList.add(null);
    }
    

    然后是myList。get(67)

    将返回null,但不会引发异常

    所有这些都适用于二维数组和列表

  3. # 3 楼答案

    大小真的是未知的,还是随意的,动态的

    • 如果它只有一个任意大小(已知但可能会改变) 随着时间的推移),使用Set(不同,无序)或List(有序, 不可分辨)或Deque(有序,双端堆栈) 操作)
    • 如果大小确实未知,请将列表视为 Iterable(可以产生有限的非有限的Iterator循环 或者将其公开为Stream(也可以是 有限/非有限)
  4. # 4 楼答案

    Java中的列表与数组不同。把列表想象成一系列元素(没有间隙!)。 ArrayList只是列表的一个实现。尽管它使用数组在内部存储其元素,但它的行为仍必须与任何其他列表(例如a LinkedList)一样

    Java列表(所以即使它是ArrayList)也会跟踪已经添加了多少元素。所以,即使创建这样的列表:List<List<Integer>> list = new ArrayList<>(256);,它仍然知道此时它是空的,所以访问第67个元素失败

    如果这样的行为不适合您,那么您不应该在这里使用列表,您可以简单地使用数组而不是ArrayList

  5. # 5 楼答案

    数组列表是一个可自行调整大小的数组。因此,它有两个重要的内在价值。容量(分配的内部数组的大小)和大小(元素的实际数量)。从文件中:

    Each ArrayList instance has a capacity. The capacity is the size of the array used to store the elements in the list. It is always at least as large as the list size. As elements are added to an ArrayList, its capacity grows automatically. The details of the growth policy are not specified beyond the fact that adding an element has constant amortized time cost.

    对于您的情况,这意味着您正在分配一个ArrayList,它允许在不调整大小的情况下添加255个元素。这并不意味着你可以访问这些索引中的任何一个

    因此,必须首先像这样初始化值:

    ArrayList<ArrayList<Integer>>  bList = new ArrayList<>(256);
    for(int i = 0; i< 256; i++) {
        bList.add(new ArrayList<>());
    }
    

    这实际上是在创建数组列表