2009-02-28 135 views
1

这可能很简单,但我真的无法在Google上正确说出它。我有一个ArrayList保存每个线程的信息。每个线程都有自己的ID。所以,一开始:Java列表允许空白

myList.add(theIdOfTheThread, new InfoForTheThread()); //Add new thread info at index theIdOfTheThread 

而当我想信息:

myList.get(myId); //The info for the thread 

不过,我总是得到OutOfRangeExceptions每当有底线的完成和删除其条目,等等。所以,我相信有必须是一个更好的类,为此我可以在任何我想要的索引中插入条目,并将它们拖放到我想要的任何索引处并保留。

回答

9

对于那种访问,你应该真的使用一个数组或更好的HashMap。使用列表是非常低效和不必要的复杂。如果您从列表中间删除某项内容,则所有内容都将向下移动,并且您移除的内容之上的所有索引都将需要向下移动。

InfoForTheThread的数组不会受到这种影响,但在开始之前,您需要知道所需数组的大小。

改为使用HashMap - 您可以使用Integers作为键,并且删除不会导致重新排序。

HashMap<Integer,InfoForTheThread> myInfos = new HashMap<Integer,InfoForTheThread>(10); 

添加,检索和删除的条目:

myInfos.put(Integer.valueOf(4), new InfoForTheThread()); 
InfoForTheThread infoForFour = myInfos.get(Integer.valueOf(4)); 
InfoForTheThread infoForFour = myInfos.remove(Integer.valueOf(4)); 
3

尝试哈希表。您可以使用线程ID作为密钥,然后将您的信息作为值插入。

+0

我同意。作为一个例子: Hashtable threads = new Hashtable //存储线程信息编号 threads.put(threadId,threadInfo); //通过编号获取线程信息 threads.get(threadId); //如果没有该id的线程,将会为null – 2009-02-28 22:35:08

+1

除非你有一些深奥的线程问题需要一切同步,否则不要使用Java的Hashtable类。总是使用HashMap(如果需要,可以使用同步包装器)。 – MetroidFan2002 2009-03-01 18:08:15