K: Vector tai ArrayList - mikä on parempi ja miksi?
A: Joskus Vektori
on parempi; joskus ArrayList
on parempi; joskus et halua käyttää kumpaakaan. Toivon, ettet etsinyt helppoa vastausta, koska vastaus riippuu siitä, mitä olet tekemässä. Huomioon on otettava neljä tekijää:
- API
- Synkronointi
- Tietojen kasvu
- Käyttömallit
Tutkitaan kutakin peräkkäin.
API
Sisään Java-ohjelmointikieli (Addison-Wesley, kesäkuu 2000) Ken Arnold, James Gosling ja David Holmes kuvaavat Vektori
analogisena ArrayList
. Joten API: n näkökulmasta nämä kaksi luokkaa ovat hyvin samanlaisia. Näiden kahden luokan välillä on kuitenkin edelleen joitain merkittäviä eroja.
Synkronointi
Vektorit
ovat synkronoituja. Mikä tahansa menetelmä, joka koskettaa Vektori
sen sisältö on langattomasti turvallista. ArrayList
, toisaalta, on synkronoimaton, joten ne eivät siten ole langattomia. Kun otetaan huomioon tämä ero, synkronoinnin käyttäminen aiheuttaa suorituskyvyn osuman. Joten jos et tarvitse langankestävää kokoelmaa, käytä ArrayList
. Miksi maksaa synkronoinnin hinta tarpeettomasti?
Tietojen kasvu
Sisäisesti molemmat ArrayList
ja Vektori
pidä kiinni niiden sisällöstä käyttämällä Taulukko
. Sinun on pidettävä tämä seikka mielessä, kun käytät kumpaakin ohjelmissasi. Kun lisäät elementin ArrayList
tai a Vektori
, objektin on laajennettava sisäistä taulukkoaan, jos se loppuu huoneesta. A Vektori
oletuksena kaksinkertaistaa taulukon koon, kun taas ArrayList
lisää matriisin kokoa 50 prosenttia. Riippuen siitä, miten käytät näitä luokkia, saatat päätyä suureen suorituskykyosuuteen lisäämällä uusia elementtejä. On aina parasta asettaa objektin alkukapasiteetti suurimmalle kapasiteetille, jota ohjelma tarvitsee. Asettamalla kapasiteetti huolellisesti, voit välttää sisäisen taulukon koon muuttamiseen tarvittavan sakon maksamisen myöhemmin. Jos et tiedä kuinka paljon tietoa sinulla on, mutta tiedät sen kasvunopeuden, Vektori
sillä on pieni etu, koska voit asettaa lisäysarvon.
Käyttömallit
Molemmat ArrayList
ja Vektori
ovat hyviä elementtien noutamiseksi tietystä sijainnista säiliössä tai elementtien lisäämiseen ja poistamiseen säiliön päästä. Kaikki nämä toiminnot voidaan suorittaa vakiona - O (1). Elementtien lisääminen ja poistaminen mistä tahansa muusta paikasta osoittautuu kuitenkin kalliimmaksi - tarkalleen lineaariseksi: O (n-i), missä n on elementtien lukumäärä ja i on lisätyn tai poistetun elementin hakemisto. Nämä toiminnot ovat kalliimpia, koska sinun on siirrettävä kaikki elementit hakemistossa i ja korkeampi yhden elementin yli. Joten mitä tämä kaikki tarkoittaa?
Se tarkoittaa, että jos haluat indeksoida elementtejä tai lisätä tai poistaa elementtejä taulukon lopussa, käytä joko a Vektori
tai an ArrayList
. Jos haluat tehdä jotain muuta sisällölle, etsi itsellesi toinen säiliöluokka. Esimerkiksi LinkedList
voi lisätä tai poistaa elementin missä tahansa paikassa vakiona - O (1). Elementin indeksointi on kuitenkin hieman hitaampaa - O (i) missä i on elementin indeksi. Liikkuminen ja ArrayList
on myös helpompaa, koska voit käyttää vain hakemistoa iteraattorin luomisen sijaan. LinkedList
luo myös sisäisen objektin jokaiselle lisätylle elementille. Joten sinun on oltava tietoinen syntyvästä ylimääräisestä roskasta.
Lopuksi julkaisussa "PRAXIS 41" Käytännöllinen Java (Addison-Wesley, helmikuu 2000) Peter Haggar ehdottaa, että käytät tavallista vanhaa taulukkoa jommankumman sijasta Vektori
tai ArrayList
- erityisesti suorituskykykriittisten koodien osalta. Taulukon avulla voit välttää synkronoinnin, ylimääräiset menetelmäpuhelut ja optimaalisen koon muuttamisen. Maksat vain ylimääräisen kehitysajan kustannukset.
Lisätietoja tästä aiheesta
- Java-ohjelmointikieli Ken Arnold, James Gosling ja David Holmes (Addison-Wesley, kesäkuu 2000; ISBN0201704331)
//www.amazon.com/exec/obidos/ASIN/0201704331/javaworld/
- Käytännöllinen Java Peter Haggar (Addison-Wesley, helmikuu 2000; ISBN0201616467)
//www.amazon.com/exec/obidos/ASIN/0201616467/javaworld/
- Haluta lisää? Katso Java-kysymykset ja vastaukset Hakemisto koko Q & A-luetteloon
//www.javaworld.com/javaworld/javaqa/javaqa-index.html
- Jos haluat saada yli 100 oivaltavaa Java-vinkkiä yrityksen parhailta mieliltä, käy osoitteessa JavaWorld 's Java-vinkkejä indeksi
//www.javaworld.com/javatips/jw-javatips.index.html
- Rekisteröidy JavaWorld tällä viikolla ilmainen viikoittainen sähköpostitiedote uutuuksista JavaWorld
//idg.net/jw-subscribe
Tämä tarina "Vector tai ArrayList - mikä on parempi?" julkaisi alun perin JavaWorld.