Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList-未设置现有元素_Java_Arrays_Arraylist_Libgdx - Fatal编程技术网

Java ArrayList-未设置现有元素

Java ArrayList-未设置现有元素,java,arrays,arraylist,libgdx,Java,Arrays,Arraylist,Libgdx,当我尝试时: //Util.java public static ArrayList<Sprite> Load(String[] path, int numOfFiles){ ArrayList<Sprite> sprites = new ArrayList<Sprite>(numOfFiles); Texture texture; Sprite sprite; for(int i = 0; i < numOfFiles

当我尝试时:

//Util.java

public static ArrayList<Sprite> Load(String[] path, int numOfFiles){
    ArrayList<Sprite> sprites = new ArrayList<Sprite>(numOfFiles);
    Texture texture;
    Sprite sprite;
    for(int i = 0; i < numOfFiles; i++){
        texture = new Texture(Gdx.files.internal(path[i]));
        texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
        sprite = new Sprite(texture);
        sprite.flip(false, true);
        sprites.set(i, sprite);
    }
    return sprites;
}
如果我打电话:

//TheGame.java

ArrayList<Sprite> sprites;
String[] filenames = {"a.png", "b.png", "c.png"};

sprites = new ArrayList<Sprite>();

sprites.addAll(Util.Load(filenames, 3));
每套:

将此列表中指定位置的元素替换为 指定的元素

这就是
IndexOutOfBoundsException
的原因,因为您在调用
set
之前没有调用
add
简而言之,当调用
set
方法时,您的列表仍然是空的

根据set:

将此列表中指定位置的元素替换为 指定的元素

这就是
IndexOutOfBoundsException
的原因,因为您在调用
set
之前没有调用
add
简而言之,调用
set
方法时,列表仍然为空

构造函数不会创建大小为
numofiles
的数组列表。它创建一个大小为0的ArrayList,其内部数组的容量为
numofiles
。由于列表为空,因此无法设置元素,因为没有要设置的元素。向ArrayList构造函数提供一个数字的唯一目的是作为一种优化,以在列表增长时减少内部数组的重新分配

您问题中代码的第二个版本是正确的。你应该这样写。您可以选择将
numofiles
作为优化传递给ArrayList构造函数,以确保其数组的大小完全符合所需的大小,但您仍必须调用
add
,而不是
set
构造函数不会创建大小为
numofiles
的ArrayList。它创建一个大小为0的ArrayList,其内部数组的容量为
numofiles
。由于列表为空,因此无法设置元素,因为没有要设置的元素。向ArrayList构造函数提供一个数字的唯一目的是作为一种优化,以在列表增长时减少内部数组的重新分配


您问题中代码的第二个版本是正确的。你应该这样写。您可以选择将
numofiles
作为优化传递给ArrayList构造函数,以确保其数组的大小完全符合所需的大小,但是您仍然必须调用
add
,而不是
set
您将获得
IndexOutOfBoundsException
,因为当您尝试用
sprites.set(i,sprite)替换项目时,ArrayList中没有元素

您将获得
IndexOutOfBoundsException
,因为当您尝试用
sprites.set(i,sprite)替换项目时,ArrayList中没有元素

我更喜欢按我想要的方式使用它
为什么?你认为这两种方法的区别在哪里?@Tom:我想先分配内存,以便更快地加载(比如说,如果有10-100个图像要加载)。多亏了Boann,我明白了为什么它现在不起作用。
我更愿意按我想要的方式使用它
,为什么?你认为这两种方法的区别在哪里?@Tom:我想先分配内存,以便更快地加载(比如说,如果有10-100个图像要加载)。多亏了Boann,我明白为什么现在没用了。谢谢你。你非常清楚地解释了我做错了什么
n
精灵的
数量分配内存。@BReynolds是。不,它为精灵的
n
指针分配内存。实际的精灵对象是由
新精灵(…)
行创建的。拥有
新的ArrayList(n)
@BReynolds是否会有好处?这只是一个很小的好处。当ArrayList的内部数组需要展开时,它会展开50%,并向下舍入奇数。空ArrayList的默认容量为10。因此,它将分配一个大小为10的数组,用于10个指向精灵的指针,然后将其反复扩展到15、22、33、49、73,最后是109。通过在构造函数中指定所需的容量,可以避免这种重新分配。但是,与分配所有Sprite对象本身、加载纹理、解析文件路径等相比,这种重新分配的成本非常小。谢谢。你非常清楚地解释了我做错了什么
n
精灵的
数量分配内存。@BReynolds是。不,它为精灵的
n
指针分配内存。实际的精灵对象是由
新精灵(…)
行创建的。拥有
新的ArrayList(n)
@BReynolds是否会有好处?这只是一个很小的好处。当ArrayList的内部数组需要展开时,它会展开50%,并向下舍入奇数。空ArrayList的默认容量为10。因此,它将分配一个大小为10的数组,用于10个指向精灵的指针,然后将其反复扩展到15、22、33、49、73,最后是109。通过在构造函数中指定所需的容量,可以避免这种重新分配。但是,与分配所有Sprite对象本身、加载纹理、解析文件路径等相比,这种重新分配的成本非常小。
//TheGame.java

ArrayList<Sprite> sprites;
String[] filenames = {"a.png", "b.png", "c.png"};

sprites = new ArrayList<Sprite>();

sprites.addAll(Util.Load(filenames, 3));
//Util.java

public static ArrayList<Sprite> Load(String[] path, int numOfFiles){
    ArrayList<Sprite> sprites = new ArrayList<Sprite>();
    Texture texture;
    Sprite sprite;
    for(int i = 0; i < numOfFiles; i++){
        texture = new Texture(Gdx.files.internal(path[i]));
        texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
        sprite = new Sprite(texture);
        sprite.flip(false, true);
        sprites.add(sprite);
    }
    return sprites;
}