Skillnad mellan ArrayList och Vector i java
ArrayList och Vector använder båda Array som en datastruktur internt. Det finns dock få skillnader i hur de lagrar och bearbetar data. I det här inlägget kommer vi att diskutera skillnaden och likheterna mellan ArrayList och vektor.
ArrayList Vs Vector:
1) synkronisering: ArrayList är icke-synkroniserad vilket innebär att flera trådar kan fungera på ArrayList samtidigt. För t. ex. om en tråd utför en add-operation på ArrayList kan det finnas en annan tråd som utför remove-operation på ArrayList samtidigt i en flertrådad miljö
medan Vector är synkroniserad. Det betyder att om en tråd arbetar på Vector, kan ingen annan tråd få tag på den. Till skillnad från ArrayList kan endast en tråd utföra en operation på vector åt gången.
2) Ändra storlek: både ArrayList och Vector kan växa och krympa dynamiskt för att bibehålla optimal användning av lagring, men hur de ändrar storlek är annorlunda. ArrayList växa med hälften av sin storlek när storleksändras medan Vector fördubblar storleken på sig själv som standard när växer.
3) Prestanda: ArrayList ger bättre prestanda eftersom den inte är synkroniserad. Vektoroperationer ger dålig prestanda eftersom de är trådsäkra, tråden som fungerar på vektorn får ett lås på det som gör att andra trådar väntar tills låset släpps.
4) fail-fast: låt mig först förklara vad som är fail-fast: Om samlingen (ArrayList, vector etc) blir strukturellt modifierad på något sätt, förutom Lägg till eller ta bort metoder för iterator, efter skapandet av iterator kommer iteratorn att kasta ConcurrentModificationException
. Strukturell modifiering avser tillägg eller radering av element från samlingen.
enligt vektorn javadoc är uppräkningen som returneras av vektorn inte snabb. På andra sidan är iteratorn och listiteratorn som returneras av ArrayList fail-fast.
5) Vem tillhör insamlingsramen verkligen? Vektorn var inte en del av samlingsramen, den har inkluderats i samlingar senare. Det kan betraktas som äldre kod. Det finns inget om vektor som List collection inte kan göra. Därför bör vektor undvikas. Om det finns behov av trådsäker drift gör ArrayList synkroniserad som diskuteras i nästa avsnitt i detta inlägg eller använd CopyOnWriteArrayList som är en trådsäker variant av ArrayList.
det finns få likheter mellan dessa klasser som är följande:
- både vektor och ArrayList använder growable array datastruktur.
- iteratorn och listiteratorn som returneras av dessa klasser (vektor och ArrayList) misslyckas snabbt.
- de är båda beställda samlingsklasser eftersom de behåller elementens insättningsordning.
- vektor & ArrayList tillåter båda dubbla och null-värden.
- de växer och krymper automatiskt när överflöde och radering sker.
När ska man använda ArrayList och när ska man använda vector?
det beror helt på kravet. Om det finns ett behov av att utföra ”trådsäker”-operation är vektorn din bästa insats eftersom det säkerställer att endast en tråd kommer åt samlingen åt gången.
prestanda: synkroniserade operationer förbrukar mer tid jämfört med icke-synkroniserade, så om det inte finns något behov av trådsäker drift är ArrayList ett bättre val eftersom prestanda kommer att förbättras på grund av samtidiga processer.
hur man gör ArrayList synkroniserad?
som jag nämnde ovan ArrayList metoder är icke-synkroniserade men fortfarande om det finns ett behov kan du göra dem synkroniserade så här –
//Use Collecions.synzhonizedList methodList list = Collections.synchronizedList(new ArrayList());...//If you wanna use iterator on the synchronized list, use it//like this. It should be in synchronized block.synchronized (list) { Iterator iterator = list.iterator(); while (iterator.hasNext()) ... iterator.next(); ...}