Introduktion

Næsten alle programmer skal gemme et sæt data. Det kan være strenge og tal, objekter og så videre. Arrays er en fremragende opbevaringsløsning. Men arrays har visse begrænsninger. For eksempel er deres størrelse fast, elementer kan ikke fjernes, og du kan ikke indsætte elementer i midten. Samlinger blev oprettet for at omgå disse og andre begrænsninger. Alle typer samlinger (og der er mange af dem, som vi vil se senere i denne lektion) har evnen til dynamisk at ændre størrelsen på sig selv. Nogle samlingstyper kan gemme bestilte elementer og automatisk sætte nye elementer i rækkefølge, efterhånden som de tilføjes.

I denne lektion vil vi stifte bekendtskab med klassehierarkiet for basissamlingerne i Java Collections Framework . Der er også forskellige alternative biblioteker, der udvider mulighederne for standard Java Collections Framework . Den mest populære af disse er Guava (Google Collections Library).

*Ikke alle grænseflader og klasser er repræsenteret i diagrammet. Nogle blev udeladt for at gøre det lettere at forstå.

Grundlæggende grænseflader

Diagrammet viser, at der er to grundlæggende grænseflader, der er implementeret til at danne resten af ​​klasserne og grænsefladerne.

Lad os tage et kig på disse grænseflader:

  1. Samling — En almindelig samling, der indeholder et sæt elementer (objekter). Denne samling har grundlæggende metoder til at arbejde med elementer: indsæt ( add , addAll ), remove ( remove , removeAll , clear ), søg ( contains , containsAll ), tjek om samlingen er tom ( isEmpty ) og få størrelse ( size ).

  2. Kort — En samling struktureret som nøgleværdi-par. Desuden er hver nøgle i et kort unik: ikke to nøgler har identiske værdier. Denne samling kaldes undertiden en ordbog . Kort er en separat grænseflade. Det implementerer ikke samlingsgrænsefladen , men er en del af Java Collections Framework .

Nyttige metoder til at arbejde med elementer i et kort :

  • indsæt ( sæt , putAlle )

  • få ( get , keySet , values , entrySet )

  • fjerne ( fjerne , rydde )

  • søg ( containsKey , containsValue )

  • tjek om samlingen er tom ( isEmpty )

  • få størrelse ( størrelse )

Lad os nu tale mere om hver af dem.

Samling grænseflade

Collection - grænsefladen udvider Iterable- grænsefladen, som har en enkelt metode: iterator() . For os betyder det, at enhver samling, der arver Iterable , vil kunne returnere en iterator.

En iterator er et specielt objekt, som du kan bruge til at få adgang til elementerne i enhver samling, uanset dens specifikke implementering.

Figuren viser, at 3 interfaces arver samlingsgrænsefladen : List , Queue og Set . Nu vil vi se på hver af dem kort.

Liste er en ordnet samling, der tillader duplikerede værdier. Et særligt træk ved en liste er, at dens elementer er nummererede og kan tilgås efter nummer (indeks).

En gemmer elementer i den rækkefølge, de blev tilføjet til køen.

I modsætning til en liste repræsenterer et sæt en uordnet samling, der ikke tillader gentagne elementer. Set - grænsefladen svarer til konceptet for et matematisk sæt .

Implementeringer af kortgrænsefladen

Vi kan se, at kortgrænsefladen repræsenterer en kortlægning mellem unikke nøgler og værdier.


interface Map<K, V>

hvor K er typen af ​​tasterne og V er typen af ​​de lagrede værdier.

Ved hjælp af en nøgle kan vi udtrække data fra et kort . For at tilføje et element til et kort skal vi angive en nøgle og en værdi.

Lad os se på nogle implementeringer af Map :

  1. HashMap er en implementering af Map , der er baseret på hash-tabeller. Den kan gemme nøgler og værdier af enhver type, inklusive null . Rækkefølgen af ​​elementerne er ikke garanteret.

  2. LinkedHashMap er en datastruktur, der gemmer data som en sammenkædet liste over elementer. Elementerne vises på listen i den rækkefølge, de blev tilføjet.

  3. TreeMap implementerer SortedMap- grænsefladen (via NavigableMap- grænsefladen). Elementerne i denne struktur gemmes i sorteret rækkefølge (når et nyt element tilføjes, sorteres samlingen automatisk). TreeMap er fantastisk til at gemme store mængder af sorteret data med hurtig hentning.

Forældede samlinger:

Java har forældede samlinger fra tidligere versioner (for at opretholde bagudkompatibilitet). Disse gamle samlinger bør ikke bruges i ny kode:

  • Optælling — analogt med Iterator- grænsefladen;

  • Vector — en ordnet liste over elementer og analog med ArrayList- klassen;

  • Stak — en implementering af stakdatastrukturen, som gemmer og manipulerer elementer som hvordan du ville interagere med en stak bøger. Der er metoder til at tilføje elementer til stakken ( skub ) og tage dem af ( pop );

  • Ordbog — analogt med kortgrænsefladen , men det er en abstrakt klasse;

  • Hashtable — analogt med HashMap .

Du kan læse mere om Collections Framework i denne artikel .