问题描述
因此,我一直在尝试创建泛型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
。