ArrayList正确使用?

时间:2012-03-15 20:09:47

标签: java android

有问题..我有一个mp3文件名列表 添加新文件名使用:

musicList.add(new Mp3(id, filename));

现在我想创建一个包含此列表的数组

 private static final int LIST_COUNT = 8;
 public static List<List<Mp3>> musicLists = new ArrayList<List<Mp3>>(LIST_COUNT);

private void parseMus(){
     musicLists = new ArrayList<List<Mp3>>(LIST_COUNT);
     ...
    //gettin mp3 list id,filename, length
    ...
    musicLists.get(listNr).add(new Mp3(id,filename,length));
...
}

但它给了我错误:

     03-15 21:01:36.030: E/AndroidRuntime(3393): java.lang.IndexOutOfBoundsException: Invalid index 4, size is 0

第二个问题! 现在我编辑了代码并且没有错误......但是现在我得到的是所有列表都填充了相同的列表..所以当我试着看到:

        for(int i =0; i< Settings.musicLists.size();i++){
        if(D)Log.e("visio added","MP3 file muslist nr="+i+"= "+Settings.musicLists.get(i)); 
    } 

我显示了8行相同的行......我做错了什么?

2 个答案:

答案 0 :(得分:5)

musicLists = new ArrayList<List<Mp3>>(LIST_COUNT);

您似乎认为此行会创建一个包含8个列表的列表。但是,它真正做的是创建一个具有初始容量8的列表的空列表。也就是说,它实际上不会将任何列表填充到musicLists中。

为了实现这一目标,您需要初始化musicLists,然后使用musicLists.add(foo)向其中添加8个List<Mp3>个对象。

答案 1 :(得分:1)

正如VeeArr所说,在获得列表之前,你需要用列表填充列表。

// this creates an empty list of initial capacity 8
musicLists = new ArrayList<List<Mp3>>(8);
//  musicList.size() is still 0
// we can add as much items as we want, the list will dynamically grow.
for (int i = 0; i < 8; i++) {
    List<Mp3> emptySubList = new ArrayList<Mp3>();
    // emptySubList.size() is 0 each as well.
    musicList.add(emptySubList);
}
//  musicList.size() is 8 now.

// do your stuff...
musicLists.get(listNr).add(new Mp3(id,filename,length));

您可以为ArrayList指定的初始容量只是一种提高内存消耗的方法。

ArrayList不同,

array[]可以动态增长。他们通过内部保留array[]来实际存储您放置在ArrayList中的数据。如果他们需要的尺寸大于array[]可以容纳的尺寸,他们会创建一个更大的array[]并将内容复制到新版本(大小总是加倍)。

这很好,因为你不必担心自己这样做。但复制阵列很昂贵。因此,您可以定义一个初始大小,以暗示您应该期望一定数量元素的ArrayList。如果你不提供初始容量,通常会很好,除非你真的知道你需要多少物品。