2009-02-28 11 views
1

Dies ist wahrscheinlich wirklich einfach, aber ich konnte es wirklich nicht richtig auf Google. Ich habe eine ArrayList, die die Informationen für jeden Thread hält. Jeder Thread hat eine eigene ID. Also, am Anfang:Java-Liste mit leeren erlaubt

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

Und wenn ich Informationen wünschen:

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

Aber ich immer OutOfRangeExceptions bekommen, wenn ein Unterfaden endet und dessen Eintrag entfernt, etc. So, da bin ich sicher, muss eine bessere Klasse sein, um dies zu verwenden, wo ich einfach Einträge in jeden gewünschten Index setzen kann und sie an jedem gewünschten Index ablegen kann und sie bleiben.

Antwort

9

Für diese Art von Zugriff sollten Sie wirklich ein Array oder besser eine HashMap verwenden. Die Verwendung einer Liste ist sehr ineffizient und unnötig kompliziert. Wenn Sie jemals ein Objekt aus der Mitte der Liste entfernen, wird alles nach unten verschoben, und alle Indizes über dem entfernten Objekt müssen nach unten verschoben werden.

Ein Array von InfoForTheThread wird nicht leiden, aber Sie müssen die Größe des Arrays kennen, die Sie benötigen, bevor Sie beginnen.

Verwenden Sie stattdessen eine HashMap - Sie können Ganzzahlen für die Schlüssel verwenden, und das Entfernen führt nicht zu einer Neusortierung.

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

Hinzufügen, Abrufen und Entfernen eines Eintrags:

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

Da Sie ohnehin Java 1.5 verwenden, warum nicht das automatische Boxen/Unboxing verwenden? – Bogdan

+0

Kraft der Gewohnheit. Wo ich arbeite Autoboxing gilt als schädlich und ist so eingestellt, um einen Fehler im Compiler zu kennzeichnen. – banjollity

3

Versuchen Sie eine Hashtabelle. Sie können die Thread-ID als Schlüssel verwenden und dann Ihre Informationen als Werte einfügen.

+0

Ich bin damit einverstanden. Als Beispiel: Hashtable threads = neue Hashtable // Thread-Informationen nach ID speichern threads.put (threadId, threadInfo); // Thread-Informationen nach ID abrufen threads.get (threadId); // ist null, wenn kein Thread mit dieser ID vorhanden ist –

+1

Wenn Sie keine esoterischen Threading-Probleme haben, bei denen alles synchronisiert werden muss, verwenden Sie niemals die Hashtable-Klasse von Java. Verwenden Sie stattdessen immer HashMap (und Sie können ggf. einen synchronisierten Wrapper verwenden). – MetroidFan2002