如何在Java中声明通用ArrayLists2d Arraylists的ArrayList?

问题描述

因此,我一直在尝试创建泛型ArrayList的ArrayList。基本上我有一个称为Color的通用类(在运行时接受Integer / Long / short值)。现在,我想创建一个名为“ Color”的2d arrayList类型,该类称为Picture。我有构造函数和arrayList的声明。但是我不明白的是,即使我声明大小大于0,为什么ArrayList的大小最终还是为0。在代码之后对此进行更多介绍...

import java.util.ArrayList;

public class Picture{

    private ArrayList<ArrayList<Color<?>>> pic;
    
    //constructor that takes in height and width of 2d array,and a Color parameter that will be populated in the 2d list
    public Picture(int height,int width,Color color){ 
        
        if((height <= 0) || (width<=0)){
            throw new indexoutofboundsexception("invalid height and/or width");
        }
        else{
            pic = new ArrayList<ArrayList<Color<?>>>(height);
            System.out.println("size of given array: "+ pic.size()); //for error handling purposes
            for(int r =0; r< pic.size(); r++ ){
                pic.set(r,new ArrayList<Color<?>>(width));
                for(int c = 0; c< width; c++){
                    pic.get(r).set(c,color);
                }

            } 

        }

    }

}

每次我运行代码来测试它,方法是创建一个新的Picture对象,例如Picture pic1 =new Picture(3,4,new Color<Integer>(2));,或者与此有关的任何高度和宽度大于0的值;我总是最终得到“给定数组的大小:0”(来自System.out.println()语句),因为列表的大小最终为0,所以甚至没有发生for循环。最后,应当在2d ArrayList中发生的颜色对象根本不会发生,并且'2d ArrayList-pic'最终不包含任何内容

我不明白我在哪里出错,在哪里为2d ArrayList分配了大小为0,即使我将其“ height”分配给了一个保证大于零的值(如果声明)。我假设我声明/初始化了2d Arraylist-pic错误。有人可以帮我吗?也可以随时指出我代码中的其他错误

谢谢

解决方法

您误解了ArrayList /该构造函数。

ArrayList具有两个属性,它们的大小均相同:

容量

这个数字几乎从不有趣,几乎没有意义。它是一个实现细节:容量为10的数组将允许您向其添加多达10个元素,而无需内部数组调整大小(什么是内部数组调整大小?..内部实现细节。我告诉过您,这基本上是不相关的)。如果您尝试添加第11个,则可以正常工作,并且作为其一部分,容量会自动增加一点(如果有内存,则可能增加到15个)。在内部,ArrayList具有一个包含数据的数组(因此具有名称),如果您尝试将一个项目添加到容量最大的arraylist中,则在内部会创建一个新的更大的数组,将旧的数组复制到新的数组上,则新阵列将代替数据存储,而旧阵列将被丢弃。这就是容量。

非常很少有方法可以注意到,而您几乎不需要关心。

大小

这是指列表中实际的条目数。它必须为capacity或更小。

new ArrayList<Whatever>(10)创建一个容量为10且大小为0的数组列表。您不能(轻松地)创建一个带有X个空指针的数组列表,并且您通常也不想这样做。例如,在这种琐碎的情况下,您要做的就是[A]将r<pic.size() arg替换为r<height,并用[B]将.set替换为.add