Overview
tässä opetusohjelmassa aiomme keskittyä ArrayList-ja Vektoriluokkien eroihin. Molemmat kuuluvat Java Collections Frameworkiin ja toteuttavat Javan.util.Listaliittymä.
näiden luokkien toteutuksissa on kuitenkin merkittäviä eroja.
mikä on toisin?
äkkilähtönä esitellään Arraylistin ja vektorin keskeiset erot. Sitten keskustelemme joitakin kohtia tarkemmin:
- synkronointi – ensimmäinen suuri ero näiden kahden välillä. Vektori on synkronoitu ja Arraylisti ei.
- koon kasvu – toinen ero näiden kahden välillä on se, miten ne muuttavat kokoaan saavuttaessaan kapasiteettinsa. Vektori tuplaa kokonsa. Arraylisti sen sijaan kasvaa vain puolella pituudestaan
- iterointi – ja vektori voi käyttää iteraattoria ja Enumeraatiota kulkiakseen alkuaineiden yli. Toisaalta Arraylisti voi käyttää vain Iteraattoria.
- suorituskyky-pitkälti synkronoinnin vuoksi Vektorioperaatiot ovat hitaampia verrattuna Arraylistiin
- framework-myös ArrayList on osa kokoelmien kehystä ja otettiin käyttöön JDK 1.2: ssa. Samaan aikaan Vector esiintyy Javan aiemmissa versioissa legacy-luokkana.
vektori
koska meillä on jo laajennettu opas Arraylistista, emme keskustele sen API: sta ja kyvyistä tässä. Toisaalta esitämme joitakin keskeisiä yksityiskohtia vektorista.
Yksinkertaisesti sanottuna vektori on resizoituva joukko. Se voi kasvaa ja kutistua, kun lisäämme tai poistamme alkuaineita.
voimme luoda vektorin tyypilliseen tapaan:
Vector<String> vector = new Vector<>();
oletuskonstruktori luo tyhjän vektorin, jonka alkukapasiteetti on 10.
lisätään muutama arvo:
vector.add("baeldung");vector.add("Vector");vector.add("example");
ja lopuksi, iteroidaan arvojen läpi käyttämällä iteraattorin rajapintaa:
Iterator<String> iterator = vector.iterator();while (iterator.hasNext()) { String element = iterator.next(); // ...}
tai voimme kulkea vektorin läpi käyttäen luettelointia:
Enumeration e = vector.elements();while(e.hasMoreElements()) { String element = e.nextElement(); // ... }
nyt, Katsotaanpa tutkia joitakin ainutlaatuisia ominaisuuksia syvällisemmin.
Concurrency
olemme jo maininneet, että Arraylisti ja vektori ovat erilaisia yhtäaikaisstrategiassaan, mutta katsotaanpa tarkemmin. Jos sukeltaisimme vektorin metodien allekirjoituksiin, näkisimme, että jokaisella on synkronoitu avainsana.:
public synchronized E get(int index)
Yksinkertaisesti sanottuna tämä tarkoittaa, että vain yksi säie voi päästä tiettyyn vektoriin kerrallaan.
oikeasti tämä operaatiotason synkronointi pitää kuitenkin joka tapauksessa laittaa päällekkäin Oman yhdistelmäoperaatioiden synkronoinnin kanssa.
siksi Arraylisti suhtautuu asiaan toisin. Sen menetelmiä ei ole synkronoitu, ja tämä huolenaihe on erotettu luokkiin, jotka on omistettu samanaikaisuus.
voidaan käyttää esimerkiksi Copyonswritearraylistiä tai kokoelmia.synkronoitu lista saada samanlainen vaikutus Vector:
vector.get(1); // synchronizedCollections.synchronizedList(arrayList).get(1); // also synchronized
suorituskyky
kuten jo edellä mainittiin, vektori on synkronoitu, mikä aiheuttaa suoran vaikutuksen suorituskykyyn.
nähdäksemme suorituseron Vektorioperaatioiden ja Arraylististen operaatioiden välillä, kirjoitetaan yksinkertainen JMH-vertailutesti.
aiemmin on tarkasteltu Arraylistin operaatioiden ajallista monimutkaisuutta, joten lisätään vektorin koetapaukset.
ensin kokeillaan get () – menetelmää:
@Benchmarkpublic Employee testGet(ArrayListBenchmark.MyState state) { return state.employeeList.get(state.employeeIndex);}@Benchmarkpublic Employee testVectorGet(ArrayListBenchmark.MyState state) { return state.employeeVector.get(state.employeeIndex);}
asetamme JMH: n käyttämään kolmea säiettä ja 10 lämmittelykertaa.
ja, raportoidaan keskimääräinen aika operaatiota kohti nanosekunnin tasolla:
Benchmark Mode Cnt Score Error UnitsArrayListBenchmark.testGet avgt 20 9.786 ± 1.358 ns/opArrayListBenchmark.testVectorGet avgt 20 37.074 ± 3.469 ns/op
we can see that ArrayList#get works about three times faster than Vector#get.
nyt, verrataan tuloksia sisältää () operaatio:
@Benchmarkpublic boolean testContains(ArrayListBenchmark.MyState state) { return state.employeeList.contains(state.employee);}@Benchmarkpublic boolean testContainsVector(ArrayListBenchmark.MyState state) { return state.employeeVector.contains(state.employee);}
ja tulosta tulokset:
Benchmark Mode Cnt Score Error UnitsArrayListBenchmark.testContains avgt 20 8.665 ± 1.159 ns/opArrayListBenchmark.testContainsVector avgt 20 36.513 ± 1.266 ns/op
kuten voimme nähdä, sisältää () – operaatiossa vektorin suoritusaika on paljon pidempi kuin Arraylisti.
Yhteenveto
tässä artikkelissa tarkasteltiin Jaavan vektori-ja Arraylististen luokkien eroja. Lisäksi esittelimme myös Vektoriominaisuuksia yksityiskohtaisemmin.
kuten tavallista, tämän artikkelin koko koodi löytyy Githubista.
Aloita Spring 5: n ja Spring Boot 2: n avulla Learn Spring-kurssin avulla:
>> tutustu kurssiin