Datastrukturer
Denne korte artikel skitserer de tre mest brugte generiske datastrukturer i Java, hvad de bruges til, og hvordan de adskiller sig.
- Ordnet sekvens af elementer, hvor rækkefølgen bevares, og duplikater er tilladt.
- Typiske anvendelser: bevare indsættelsesrækkefølge, indeksbaseret opslag, datastrømme der kan indeholde gentagelser.
- Centrale implementationer:
ArrayList(hyppigst): hurtige indeksopslag, amortiseret O(1)addi slutningen, men dyrinsert/removei midten pga. kopiering.LinkedList: O(1) indsættelse/fjernelse i ender, langsommere tilfældige opslag (O(n)).List.of(...)/Collections.unmodifiableList(...): immutabel visning, godt til defensiv kopi og trådsikker deling.
- Samling uden duplikater; typisk ingen garanteret orden (afhænger af implementation).
- Typiske anvendelser: medlemskabstest, fjernelse af duplikater, hurtig deduplikering i streams.
- Centrale implementationer:
HashSet: O(1) forventet foradd/contains/remove, ingen stabil iteration-orden.LinkedHashSet: Bevarer indsættelsesrækkefølge; lidt højere overhead endHashSet.TreeSet: Sorteret efterComparable/Comparator; O(log n) operationer, muliggør range-forespørgsler (subSet,headSet).
- Nøgleværdi-par, hvor nøgler er unikke; typisk ingen garanteret orden (afhænger af implementation).
- Typiske anvendelser: opslagstabeller, caches, frekvenstælling, konfigurationer.
- Centrale implementationer:
HashMap: O(1) forventet forput/get/remove, ingen iteration-orden.LinkedHashMap: Bevarer indsættelsesrækkefølge eller adgangsorden (kan bruges til simple LRU-caches viaremoveEldestEntry).TreeMap: Sorteret på nøgle; O(log n) operationer og understøtter range-forespørgsler (subMap,floorEntry).ConcurrentHashMap: Trådsikker med høj parallelitet; undgåHashtablei nyt kode.
- Immutabilitet: Brug
List.of,Set.of,Map.ofellerCollections.unmodifiable*når datastrukturen ikke må ændres; reducerer fejl og gør deling mellem tråde enklere. - Iteration-orden: Vælg
LinkedHash*hvis du skal bevare rækkefølge; vælgTree*hvis du skal have sortering eller range-forespørgsler. - Præstation:
Hash*varianter er hurtigst for konstante opslag;Tree*giver orden på bekostning af logaritmisk tid;LinkedLister niche og bør primært bruges ved mange indsættelser i enderne. - Nøgler og hashing: Sørg for stabile
equals/hashCodepå nøgler tilHashMap/HashSet; mutable nøgler i disse strukturer skaber hårde fejl. - Tråde: Brug
Collections.synchronized*ellerConcurrentHashMap/immutables for trådsikkerhed; undgå manuel synkronisering hvor høj konkurrence forventes.
| Strukturer | Tillader duplikater | Bevarer rækkefølge | Sorteret | Opslagsnøgle | Typisk kompleksitet* | Primære formål |
|---|---|---|---|---|---|---|
| List | Ja | Ja | Nej (medmindre eksplicit sorteret) | Indeks | get O(1) (ArrayList), add O(1) amortiseret i slutningen | Ordnet sekvens med mulige gentagelser |
| Set | Nej | Nej (HashSet), Ja (LinkedHashSet), Sorteret (TreeSet) | Mulig (TreeSet) | Element som nøgle | add/contains O(1) forventet (HashSet), O(log n) (TreeSet) | Unikke elementer og medlemskabstest |
| Map | Nej (unikke nøgler) | Nej (HashMap), Ja (LinkedHashMap), Sorteret (TreeMap) | Mulig (TreeMap) | Nøgle → værdi | put/get O(1) forventet (HashMap), O(log n) (TreeMap) | Opslags- og associerende tabeller |
*Kompleksitet er for de mest brugte implementationer og under antagelse af gode hashfunktioner.
- Vælg List når rækkefølge og duplikater er acceptable, f.eks. log-lister eller inputrækker.
- Vælg Set når du vil sikre unikhed eller teste medlemskab hurtigt.
- Vælg Map når du skal forbinde nøgler til værdier, f.eks. cache eller slå-tabeller.