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 Vektor
Indholdet er trådsikkert. ArrayList
er 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.