Verschil tussen ArrayList en Vector in java

ArrayList en Vector beide gebruiken Array intern als gegevensstructuur. Er zijn echter weinig verschillen in de manier waarop ze de gegevens opslaan en verwerken. In dit artikel zullen we het verschil en de overeenkomsten tussen ArrayList en Vector bespreken.

ArrayList Vs Vector:

1) synchronisatie: ArrayList is niet gesynchroniseerd, wat betekent dat meerdere threads tegelijkertijd op ArrayList kunnen werken. Voor bijv. als een thread een add-bewerking uitvoert op ArrayList, kan er een andere thread zijn die tegelijkertijd een remove-bewerking uitvoert op ArrayList in een multithreaded-omgeving

terwijl Vector is gesynchroniseerd. Dit betekent dat als een thread werkt op Vector, geen andere thread kan krijgen een greep van het. In tegenstelling tot ArrayList, kan slechts één thread een bewerking op vector tegelijk uitvoeren.

2) Resize: zowel ArrayList als Vector kunnen dynamisch groeien en krimpen om het optimale gebruik van opslag te behouden, maar de manier waarop ze van grootte veranderen is anders. ArrayList groeit met de helft van zijn grootte wanneer het formaat wordt aangepast, terwijl Vector verdubbelt de grootte van zichzelf standaard wanneer groeit.

3) Prestaties: ArrayList geeft betere prestaties omdat het niet-gesynchroniseerd is. Vectorbewerkingen geven slechte prestaties omdat ze thread-safe zijn, de thread die werkt op Vector krijgt een slot op het waardoor andere thread wacht tot het slot is vrijgegeven.

4) fail-fast: laat me eerst uitleggen wat fail-fast is: Als de verzameling (ArrayList, vector enz.) structureel gewijzigd wordt, met uitzondering van de add of remove methoden van iterator, na het aanmaken van iterator dan zal de iterator ConcurrentModificationExceptiongooien. Structurele wijziging verwijst naar de toevoeging of schrapping van elementen uit de collectie.

volgens de vector javadoc is de opsomming geretourneerd door Vector niet fail-fast. Aan de andere kant zijn de iterator en listIterator teruggestuurd door ArrayList fail-fast.

5) wie behoort werkelijk tot het collectiekader? De vector was niet het onderdeel van collection framework, het is later opgenomen in collecties. Het kan worden beschouwd als Legacy code. Er is niets over Vector die Lijstverzameling niet kan doen. Daarom moet Vector worden vermeden. Als er behoefte is aan thread-safe operatie maak ArrayList gesynchroniseerd zoals besproken in de volgende sectie van dit bericht of gebruik CopyOnWriteArrayList die een thread-safe variant van ArrayList is.

er zijn weinig overeenkomsten tussen deze klassen, die als volgt zijn::

  1. zowel Vector als ArrayList gebruiken growable array data structuur.
  2. de iterator en listIterator die door deze klassen worden geretourneerd (Vector en ArrayList) zijn fail-fast.
  3. beide zijn geordende collectieklassen omdat ze de volgorde van invoegen van elementen behouden.
  4. Vector & ArrayList staat zowel dubbele als null waarden toe.
  5. ze groeien en krimpen automatisch bij overflow en verwijdering.

wanneer ArrayList gebruiken en wanneer Vector gebruiken?

het hangt volledig af van de eis. Als er een noodzaak om uit te voeren “thread-safe” operatie de vector is uw beste weddenschap als het zorgt ervoor dat slechts één thread toegang tot de collectie op een moment.

prestaties: gesynchroniseerde bewerkingen vergen meer tijd dan niet-gesynchroniseerde bewerkingen, dus als er geen thread veilige werking nodig is, is ArrayList een betere keuze omdat de prestaties zullen worden verbeterd door de gelijktijdige processen.

Hoe kan ArrayList gesynchroniseerd worden?
zoals hierboven vermeld zijn ArrayList methoden niet-gesynchroniseerd, maar als er toch behoefte is, kunt u ze zo synchroniseren –

//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(); ...}