Wechsel von ArrayList zu Vector

7

Ich arbeite an einem Android-Spiel und ich habe gerade bemerkt, dass, da onTouchEvent auf dem UI-Thread läuft und die update / render-Methoden von einem separaten Thread laufen, beide ein ArrayList aktualisieren, das das enthält Entitäten. Offensichtlich widersprechen sie sich, wenn sie zufällig die Liste gleichzeitig ändern.

Ich habe gelesen, dass die Vector -Klasse genauso verwendet wird wie ArrayList , mit dem einzigen Unterschied, dass Vector synchronisiert ist, also werden sie nicht in Konflikt geraten. Ist das wahr? wenn ja, hat es ein Leistungsproblem oder etwas, worüber ich besorgt sein sollte? Ich habe noch nie Vector class verwendet.

BEARBEITEN: Was ich eigentlich meinte, war Wechsel von

ArrayList<Obj> list = new ArrayList<Obj>();

bis

Vector<Obj> list = new Vector<Obj>()

Aber wie die Antworten sagen, wird Vector nicht empfohlen. Die ausgewählte Antwort hat mein Problem gelöst.

    
Christopher Francisco 04.07.2013, 21:49
quelle

4 Antworten

9

Es ist Oldie Vector versuche nicht, stattdessen Vector zu verwenden

synchronizedList

Beispiel:

%Vor%

Der Vektor gilt als veraltet und nicht mehr weiterentwickelt. Lesen Sie Why vector is considerer veraltet?

    
nachokk 04.07.2013, 21:53
quelle
20

Für diejenigen, die mit Legacy-Code kämpfen müssen, tun Sie Folgendes:

%Vor%     
Sergio Gabari 04.04.2014 09:43
quelle
2
%Vor%

sollte funktionieren. Beide dieser Strukturen implementieren List-Schnittstelle.

Aber wie andere Leute vorgeschlagen, wird dies nicht empfohlen.

    
ArturSkowronski 04.07.2013 21:53
quelle
0

Wie bereits von nachokk erwähnt, wird synchonizedList den Trick machen. synchronizedList gibt einen Wrapper um die Liste zurück, so dass kein Kopieren ausgeführt wird.
Der Nachteil ist, dass nur ein Anruf zu der Liste gleichzeitig erfolgen kann. Zwei Lesevorgänge in der Liste sind sequenziell, auch wenn sie parallel ausgeführt werden könnten. Synchronisierte Blöcke bedeuten immer einen geringen Overhead und verringern die Leistung, wenn sie oft aufgerufen werden.

Eine andere Option wäre die gleichzeitige Verwendung einer Liste. Dies bedeutet eine Kopie an erster Stelle, aber die Zugriffsleistung könnte erheblich verbessert werden. Wenn Sie viele Leseanfragen haben (z. B. für Gemälde), ist eine CopyOnWriteArrayList eine gute Wahl. Lesevorgänge sind fast so schnell wie eine normale ArrayList und werden nicht blockiert. Schreibvorgänge in die Liste sind sequentiell und teuer, da sie das gesamte Array kopieren müssen.
Ein weiterer guter Punkt für CoWarrayList ist, dass Sie iterieren können, ohne eine ConcurrentModificationException abzufangen. Der Iterator, der von iterator() zurückgegeben wird, verwendet immer dasselbe Backward-Array, auch wenn die Liste geändert wurde.

    
Hardcoded 05.07.2013 09:11
quelle

Tags und Links