Programavimas

„Vector“ ar „ArrayList“ - kas geriau?

Klausimas: „Vector“ ar „ArrayList“ - kas geriau ir kodėl?

A: Kartais Vektorius geriau; kartais „ArrayList“ geriau; kartais nenorite naudoti nė vieno. Tikiuosi, kad jūs neieškojote lengvo atsakymo, nes atsakymas priklauso nuo to, ką darote. Reikia atsižvelgti į keturis veiksnius:

  • API
  • Sinchronizavimas
  • Duomenų augimas
  • Naudojimo modeliai

Panagrinėkime kiekvieną iš eilės.

API

Į „Java“ programavimo kalba (Addison-Wesley, 2000 m. Birželio mėn.) Kenas Arnoldas, Jamesas Goslingas ir Davidas Holmesas apibūdina Vektorius kaip analogą „ArrayList“. Taigi, žvelgiant iš API perspektyvos, abi klasės yra labai panašios. Tačiau vis dar yra keletas didelių skirtumų tarp abiejų klasių.

Sinchronizavimas

Vektoriai yra sinchronizuojami. Bet koks metodas, paliečiantis Vektoriusturinys yra saugus siūlams. „ArrayList“, kita vertus, yra nesinchronizuotas, todėl jie nėra saugūs siūlams. Turint omenyje šį skirtumą, naudojant sinchronizavimą bus pasiektas našumas. Taigi, jei jums nereikia kolekcijos, saugios siūlams, naudokite „ArrayList“. Kodėl be reikalo reikia mokėti sinchronizavimo kainą?

Duomenų augimas

Viduje tiek „ArrayList“ ir Vektorius laikykite jų turinį naudodami Masyvas. Turite nepamiršti šio fakto, kai naudojate bet kurią iš savo programų. Kai įterpiate elementą į „ArrayList“ arba a Vektorius, objektui reikės išplėsti savo vidinį masyvą, jei jo nebeliks. A Vektorius numatytai padvigubina savo masyvo dydį, o „ArrayList“ padidina jo masyvo dydį 50 procentų. Priklausomai nuo to, kaip naudojate šias klases, galite sulaukti didelio našumo smūgio ir pridėti naujų elementų. Visada geriausia nustatyti didžiausią objekto pradinį pajėgumą, kurio reikės jūsų programai. Kruopščiai nustatydami talpą, galite išvengti baudos, reikalingos vėliau pakeisti vidinio masyvo dydį. Jei nežinote, kiek turėsite duomenų, bet žinote jų augimo greitį, Vektorius turi nedidelį pranašumą, nes galite nustatyti prieaugio vertę.

Naudojimo modeliai

Tiek „ArrayList“ ir Vektorius yra tinkami elementams iš tam tikros vietos talpykloje paimti arba elementams pridėti ir pašalinti iš konteinerio galo. Visas šias operacijas galima atlikti pastoviu laiku - O (1). Tačiau elementų pridėjimas ir pašalinimas iš bet kurios kitos vietos yra brangesnis - tiksliau linijinis: O (n-i), kur n yra elementų skaičius ir i yra pridėto ar pašalinto elemento rodyklė. Šios operacijos yra brangesnės, nes turite perkelti visus indekso elementus i ir aukščiau vieno elemento. Taigi, ką visa tai reiškia?

Tai reiškia, kad jei norite indeksuoti elementus arba pridėti ir pašalinti elementus masyvo pabaigoje, naudokite arba a Vektorius arba an „ArrayList“. Jei norite padaryti ką nors kita dėl turinio, eikite ir raskite kitą konteinerių klasę. Pavyzdžiui, „LinkedList“ galite pridėti arba pašalinti elementą bet kurioje vietoje pastoviu laiku - O (1). Tačiau elemento indeksavimas yra šiek tiek lėtesnis - O (i) kur i yra elemento indeksas. Traversas an „ArrayList“ yra taip pat lengviau, nes jūs galite tiesiog naudoti indeksą, o ne kurti iteratorių. „LinkedList“ taip pat sukuria vidinį objektą kiekvienam įterptam elementui. Taigi jūs turite žinoti apie kuriamas papildomas šiukšles.

Galiausiai „PRAXIS 41“ iš Praktinė Java (Addison-Wesley, 2000 m. Vasario mėn.) Peteris Haggaras siūlo naudoti paprastą seną masyvą vietoje Vektorius arba „ArrayList“ - ypač kritinio našumo kodui. Naudodami masyvą galite išvengti sinchronizavimo, papildomo metodo iškvietimų ir neoptimalaus dydžio keitimo. Jūs tiesiog mokate papildomo kūrimo laiko sąnaudas.

Sužinokite daugiau apie šią temą

  • „Java“ programavimo kalba Kenas Arnoldas, Jamesas Goslingas ir Davidas Holmesas (Addison-Wesley, 2000 m. Birželio mėn.; ISBN0201704331)

    //www.amazon.com/exec/obidos/ASIN/0201704331/javaworld/

  • Praktinė Java Peteris Haggaras (Addison-Wesley, 2000 m. Vasario mėn .; ISBN0201616467)

    //www.amazon.com/exec/obidos/ASIN/0201616467/javaworld/

  • Norite daugiau? Žr „Java“ klausimai ir atsakymai Viso klausimų ir atsakymų katalogo rodyklė

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Norėdami gauti daugiau nei 100 įžvalgių „Java“ patarimų iš geriausių verslo atstovų, apsilankykite „JavaWorld“s „Java“ patarimai indeksas

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Prisiregistruokite „JavaWorld“ šią savaitę nemokamas savaitinis naujienlaiškis el. paštu apie tai, kas yra nauja „JavaWorld“

    //idg.net/jw-subscribe

Ši istorija „Vektorius ar„ ArrayList “- kas geriau?“ iš pradžių buvo išleista „JavaWorld“.

$config[zx-auto] not found$config[zx-overlay] not found