Programmering

Vector eller ArrayList - hvad er bedre?

Spørgsmål: Vector eller ArrayList - hvad er bedre og hvorfor?

EN: Sommetider Vektor er bedre; Sommetider ArrayList er bedre; nogle gange vil du heller ikke bruge det. Jeg håber, du ikke ledte efter et let svar, fordi svaret afhænger af, hvad du laver. Der er fire faktorer at overveje:

  • API
  • Synkronisering
  • Datavækst
  • Brugsmønstre

Lad os udforske hver efter hinanden.

API

I Java-programmeringssprog (Addison-Wesley, juni 2000) Ken Arnold, James Gosling og David Holmes beskriver Vektor som en analog til ArrayList. Så set ud fra et API-perspektiv er de to klasser meget ens. Der er dog stadig nogle store forskelle mellem de to klasser.

Synkronisering

Vektorer er synkroniseret. Enhver metode, der rører ved VektorIndholdet er trådsikkert. ArrayLister på den anden side usynkroniseret, hvilket gør dem derfor ikke trådsikre. Med denne forskel i tankerne vil brug af synkronisering medføre et præstationshit. Så hvis du ikke har brug for en trådsikker samling, skal du bruge ArrayList. Hvorfor betale synkroniseringsprisen unødigt?

Datavækst

Internt, både ArrayList og Vektor holde fast i deres indhold ved hjælp af en Array. Du skal huske denne kendsgerning, mens du bruger en af ​​dine programmer. Når du indsætter et element i en ArrayList eller a Vektor, skal objektet udvide sit interne array, hvis det løber tør for plads. EN Vektor standard fordobler størrelsen på dens array, mens ArrayList øger sin matrixstørrelse med 50 procent. Afhængigt af hvordan du bruger disse klasser, kan du ende med at tage et stort præstationshit, mens du tilføjer nye elementer. Det er altid bedst at indstille objektets startkapacitet til den største kapacitet, som dit program har brug for. Ved nøje at indstille kapaciteten kan du undgå at betale den nødvendige sanktion for at ændre størrelsen på det interne array senere. Hvis du ikke ved, hvor meget data du har, men du kender hastigheden, hvormed de vokser, Vektor har en lille fordel, da du kan indstille stigningsværdien.

Brugsmønstre

Både ArrayList og Vektor er gode til at hente elementer fra en bestemt position i beholderen eller til at tilføje og fjerne elementer fra enden af ​​beholderen. Alle disse operationer kan udføres i konstant tid - O (1). At tilføje og fjerne elementer fra enhver anden position viser sig imidlertid at være dyrere - lineært for at være nøjagtigt: O (n-i), hvor n er antallet af elementer og jeg er indekset for elementet tilføjet eller fjernet. Disse operationer er dyrere, fordi du skal skifte alle elementer i indekset jeg og højere over med et element. Så hvad betyder alt dette?

Det betyder, at hvis du vil indeksere elementer eller tilføje og fjerne elementer i slutningen af ​​arrayet, skal du bruge enten a Vektor eller en ArrayList. Hvis du vil gøre noget andet med indholdet, skal du finde dig en anden containerklasse. F.eks LinkedList kan tilføje eller fjerne et element til enhver position i konstant tid - O (1). Indeksering af et element er dog lidt langsommere - O (i) hvor jeg er elementets indeks. Krydser en ArrayList er også lettere, da du simpelthen kan bruge et indeks i stedet for at skulle oprette en iterator. Det LinkedList opretter også et internt objekt for hvert indsat element. Så du skal være opmærksom på det ekstra affald, der oprettes.

Endelig i "PRAXIS 41" fra Praktisk Java (Addison-Wesley, feb. 2000) Peter Haggar foreslår, at du bruger et almindeligt gammelt array i stedet for en af ​​dem Vektor eller ArrayList - især til præstationskritisk kode. Ved at bruge et array kan du undgå synkronisering, ekstra metodeopkald og suboptimal størrelse. Du betaler bare omkostningerne ved ekstra udviklingstid.

Lær mere om dette emne

  • Java-programmeringssprog Ken Arnold, James Gosling og David Holmes (Addison-Wesley, juni 2000; ISBN0201704331)

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

  • Praktisk Java Peter Haggar (Addison-Wesley, februar 2000; ISBN0201616467)

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

  • Ønsker mere? Se Java Q&A Indeks for det fulde Q&A katalog

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

  • For mere end 100 indsigtsfulde Java-tip fra nogle af de bedste sind i branchen, besøg JavaWorld 's Java-tip indeks

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

  • Tilmeld dig JavaWorld denne uge gratis ugentligt e-mail-nyhedsbrev for hvad der er nyt på JavaWorld

    //idg.net/jw-subscribe

Denne historie, "Vector eller ArrayList - hvad er bedre?" blev oprindeligt udgivet af JavaWorld.