V: Vector ali ArrayList - kaj je boljše in zakaj?
A: Včasih Vektor
je bolje; včasih ArrayList
je bolje; včasih nobene ne želite uporabiti. Upam, da niste iskali enostavnega odgovora, ker je odgovor odvisen od tega, kaj počnete. Upoštevati je treba štiri dejavnike:
- API
- Sinhronizacija
- Rast podatkov
- Vzorci uporabe
Raziskujmo vsakega po vrsti.
API
V Programski jezik Java (Addison-Wesley, junij 2000) Ken Arnold, James Gosling in David Holmes opisujejo Vektor
kot analogni ArrayList
. Torej sta si z vidika API oba razreda zelo podobna. Vendar pa med obema razredoma še vedno obstaja nekaj večjih razlik.
Sinhronizacija
Vektorji
so sinhronizirani. Katera koli metoda, ki se dotakne Vektor
Vsebina osebe je varna za nit. ArrayList
, po drugi strani pa je nesinhroniziran, zaradi česar niso varni za nit. Ob upoštevanju te razlike bo uporaba sinhronizacije dosegla uspešnost. Torej, če ne potrebujete zbiranja, varnega za nit, uporabite ArrayList
. Zakaj plačati ceno sinhronizacije po nepotrebnem?
Rast podatkov
Interno sta oba ArrayList
in Vektor
pridržite njihovo vsebino s pomočjo Matrika
. To dejstvo morate imeti v mislih, kadar uporabljate katerega koli od svojih programov. Ko vstavite element v ArrayList
ali a Vektor
, bo moral objekt razširiti svojo notranjo matriko, če mu zmanjka prostora. A Vektor
privzeto podvoji velikost svoje matrike, medtem ko ArrayList
poveča svojo velikost polja za 50 odstotkov. Glede na to, kako uporabljate te razrede, boste med dodajanjem novih elementov lahko na koncu dosegli velik hit uspešnosti. Vedno je najbolje, da začetno zmogljivost predmeta nastavite na največjo zmogljivost, ki jo potrebuje vaš program. S skrbno nastavitvijo zmogljivosti se lahko izognete plačilu kazni, potrebne za poznejšo spremembo velikosti notranjega polja. Če ne veste, koliko podatkov boste imeli, veste pa hitrost njihove rasti, Vektor
ima rahlo prednost, saj lahko nastavite vrednost prirastka.
Vzorci uporabe
Oba ArrayList
in Vektor
so dobri za pridobivanje elementov iz določenega položaja v vsebniku ali za dodajanje in odstranjevanje elementov s konca vsebnika. Vse te operacije je mogoče izvajati v stalnem času - O (1). Vendar pa se dodajanje in odstranjevanje elementov iz katerega koli drugega položaja izkaže dražje - natančneje linearno: O (n-i), kje n je število elementov in jaz je indeks dodanega ali odstranjenega elementa. Te operacije so dražje, ker morate vse elemente premakniti po indeksu jaz in več za en element. Torej, kaj vse to pomeni?
To pomeni, da če želite indeksirati elemente ali dodati in odstraniti elemente na koncu polja, uporabite ali Vektor
ali an ArrayList
. Če želite vsebini narediti karkoli drugega, si poiščite drug razred vsebnika. Na primer LinkedList
lahko doda ali odstrani element na katerem koli položaju v nenehnem času - O (1). Vendar je indeksiranje elementa nekoliko počasnejše - O (i) kje jaz je indeks elementa. Prehod po ArrayList
je tudi lažje, saj lahko preprosto uporabite indeks, namesto da bi morali ustvariti iterator. The LinkedList
ustvari tudi notranji objekt za vsak vstavljeni element. Torej se morate zavedati dodatnih smeti, ki nastajajo.
Končno, v "PRAXIS 41" iz Praktična Java (Addison-Wesley, februar 2000) Peter Haggar predlaga, da namesto enega ali drugega uporabite navadno staro matriko Vektor
ali ArrayList
- zlasti za kodo, ki je kritična za delovanje. Z uporabo polja se lahko izognete sinhronizaciji, klicem dodatnih metod in neoptimalni velikosti. Samo plačate stroške dodatnega razvojnega časa.
Preberite več o tej temi
- Programski jezik Java Ken Arnold, James Gosling in David Holmes (Addison-Wesley, junij 2000; ISBN0201704331)
//www.amazon.com/exec/obidos/ASIN/0201704331/javaworld/
- Praktična Java Peter Haggar (Addison-Wesley, februar 2000; ISBN0201616467)
//www.amazon.com/exec/obidos/ASIN/0201616467/javaworld/
- Želijo več? Glej Vprašanja in odgovori o Javi Kazalo za celoten katalog Vprašanj
//www.javaworld.com/javaworld/javaqa/javaqa-index.html
- Obiščite več kot 100 vpoglednih nasvetov Java nekaterih najboljših mož v poslu JavaWorld 's Java Nasveti indeks
//www.javaworld.com/javatips/jw-javatips.index.html
- Prijavite se za Ta teden JavaWorld brezplačno tedensko e-poštno glasilo o novostih na JavaWorld
//idg.net/jw-subscribe
Ta zgodba "Vector ali ArrayList - kaj je boljše?" je prvotno objavil JavaWorld.