Ero arraylistin ja vektorin välillä Javassa
Arraylisti ja vektori käyttävät molemmat Arraylistia tietorakenteena sisäisesti. Tietojen tallentamisessa ja käsittelyssä on kuitenkin vain vähän eroja. Tässä postitse keskustelemme ero ja yhtäläisyyksiä ArrayList ja vektori.
ArrayList Vs vektori:
1) synkronointi: ArrayList on synkronoimaton, mikä tarkoittaa, että useat kierteet voivat toimia Arraylistillä samanaikaisesti. Esim. jos yksi säie suorittaa add-operaation Arraylistillä, toinen säie voi suorittaa remove-operaation Arraylistillä samanaikaisesti monisäikeisessä ympäristössä
, kun vektori on synkronoitu. Tämä tarkoittaa, että jos yksi säie toimii vektorilla, mikään muu säie ei saa sitä käsiinsä. Toisin kuin Arraylisti, vain yksi säie voi suorittaa operaation vektorilla kerrallaan.
2) Resize: sekä ArrayList että vektori voivat kasvaa ja kutistua dynaamisesti säilyttääkseen tallennustilan optimaalisen käytön. ArrayList kasvaa puolet sen koosta, kun kokoa muutetaan, kun taas Vector kaksinkertaistaa koon itsestään oletuksena, kun kasvaa.
3) suorituskyky: ArrayList antaa paremman suorituskyvyn, koska se on synkronoimaton. Vektorioperaatiot antavat huonon suorituskyvyn, koska ne ovat kierreturvallisia, vektorilla toimiva Lanka saa siihen lukon, joka saa muut kierteet odottamaan lukon vapautumista.
4) fail-fast: First let me explain what is fail-fast: Jos kokoelma (Arraylisti, vektori jne.) muuttuu rakenteellisesti millä tahansa keinolla, paitsi iteraattorin Lisää tai poista-menetelmillä, iteraattorin luomisen jälkeen iteraattori heittää ConcurrentModificationException
. Rakenteellisella muutoksella tarkoitetaan elementtien lisäämistä tai poistamista kokoelmasta.
vektorin javadocin mukaan vektorin palauttama lukuarvo ei ole vikaantuva. Toisella puolella iteraattori ja listteraattori palautetaan ArrayList ovat fail-fast.
5) kuka oikeasti kuuluu keräyskehykseen? Vektori ei ollut kokoelmakehyksen osa, vaan se on sisällytetty kokoelmiin myöhemmin. Sitä voidaan pitää Legacy-koodina. Vektorissa ei ole mitään, mitä luetteloiden keruu ei voisi tehdä. Sen vuoksi vektoreita on vältettävä. Jos tarvitaan kierre-turvallinen toiminta tehdä ArrayList synkronoitu kuten seuraavassa osassa tämän viestin tai käytä Copyonswritearraylist joka on kierre-turvallinen variantti ArrayList.
näiden luokkien välillä ei ole juurikaan yhtäläisyyksiä, jotka ovat seuraavat:
- sekä vektori että Arraylisti käyttävät kasvukelpoista array-tietorakennetta.
- näiden luokkien (vektori ja Arraylisti) palauttama iteraattori ja listeraattori ovat epäonnistuneita.
- ne molemmat ovat järjestettyjä keräysluokkia, koska ne säilyttävät alkuaineiden lisäysjärjestyksen.
- vektori & ArrayList sekä sallii kaksoisarvot että nollan.
- ne sekä kasvavat että kutistuvat automaattisesti, kun ylivuotoja ja poistoja tapahtuu.
milloin käytetään Arraylistiä ja milloin vektoria?
se riippuu täysin vaatimuksesta. Jos on tarpeen suorittaa ”säiettä turvallinen” toiminta vektori on paras veto, koska se varmistaa, että vain yksi säiettä pääsy kokoelma kerrallaan.
suorituskyky: synkronoidut operaatiot kuluttavat enemmän aikaa kuin synkronoimattomat, joten jos säiettä ei tarvitse käyttää turvallisesti, ArrayList on parempi valinta, koska suorituskyky paranee samanaikaisten prosessien ansiosta.
miten Arraylisti synkronoidaan?
kuten edellä totesin Arraylistiset menetelmät ovat synkronoimattomia, mutta silti, jos on tarve, voit tehdä ne synkronoiduiksi näin –
//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(); ...}