Initialiser et HashMap i Java

1. Oversikt

I denne opplæringen lærer vi om forskjellige måter å initialisere HashMap i Java.

Vi bruker Java 8 så vel som Java 9.

2. Den statiske initialisereren for en statisk HashMap

Vi kan initialisere en HashMap bruker en statisk blokk med kode:

offentlig statisk KartartikkelMapOne; statisk {articleMapOne = ny HashMap (); articleMapOne.put ("ar01", "Intro to Map"); articleMapOne.put ("ar02", "Some article"); }

Fordelen med denne typen initialisering er at kartet kan endres, men det vil bare fungere for statisk. Følgelig kan oppføringer legges til og fjernes etter behov.

La oss gå videre og teste det:

@Test offentlig ugyldighet gittStaticMap_whenUpdated_thenCorrect () {MapInitializer.articleMapOne.put ("NewArticle1", "Convert array to List"); assertEquals (MapInitializer.articleMapOne.get ("NewArticle1"), "Konverter matrise til liste"); }

Vi kan også initialisere kartet ved hjelp av dobbelstagssyntaks:

Kart doubleBraceMap = ny HashMap () {{put ("key1", "value1"); put ("key2", "value2"); }};

Noter det vi må prøve å unngå denne initialiseringsteknikken fordi den skaper en anonym ekstra klasse ved hver bruk, har skjulte referanser til det vedlagte objektet, og kan forårsake minnelekkasjeproblemer.

3. Bruke Java-samlinger

Hvis vi trenger å lage et uforanderlig kart med en enkelt oppføring, Collections.singletonMap () blir veldig nyttig:

offentlig statisk kart createSingletonMap () {return Collections.singletonMap ("brukernavn1", "passord1"); }

Merk at kartet her er uforanderlig, og hvis vi prøver å legge til flere oppføringer, vil det kaste java.lang.UnsupportedOperationException.

Vi kan også lage et uforanderlig tomt kart ved hjelp av Collections.emptyMap ():

Map emptyMap = Collections.emptyMap ();

4. Java 8 Way

I denne delen, la oss se på måtene å initialisere et kart ved hjelp av Java 8 Stream API.

4.1. Ved hjelp av Collectors.toMap ()

La oss bruke en Strøm av et todimensjonalt String array og samle dem på et kart:

Map map = Stream.of (new String [] [] {{"Hello", "World"}, {"John", "Doe"},}). Collect (Collectors.toMap (data -> data [0] , data -> data [1]));

Legg merke til datatypen nøkkel og verdi på Kart er lik.

For å gjøre det mer generisk, la oss ta utvalget av Objekter og utføre samme operasjon:

 Map map = Stream.of (new Object [] [] {{"data1", 1}, {"data2", 2},}). Collect (Collectors.toMap (data -> (Streng) data [0], data -> (Heltall) data [1]));

Som et resultat lager vi et kart over nøkkelen som en String og verdi som en Heltall.

4.2. Bruke en strøm av Kart. Inngang

Her bruker vi forekomster av Kart. Inngang. Dette er en annen tilnærming der vi har forskjellige nøkkel- og verdityper.

La oss først bruke SimpleEntry gjennomføring av Inngang grensesnitt:

Map map = Stream.of (new AbstractMap.SimpleEntry ("idea", 1), new AbstractMap.SimpleEntry ("mobile", 2)) .collect (Collectors.toMap (Map.Entry :: getKey, Map.Entry :: getValue));

La oss nå lage kartet ved hjelp av SimpleImmutableEntry gjennomføring:

Map map = Stream.of (new AbstractMap.SimpleImmutableEntry ("idea", 1), new AbstractMap.SimpleImmutableEntry ("mobile", 2)) .collect (Collectors.toMap (Map.Entry :: getKey, Map.Entry :: getValue));

4.3. Initialisere et uforanderlig kart

I visse brukstilfeller må vi initialisere et uforanderlig kart. Dette kan gjøres ved å pakke inn Collectors.toMap () innsiden Collectors.collectingAndThen ():

Map map = Stream.of (new String [] [] {{"Hello", "World"}, {"John", "Doe"},}). Collect (Collectors.collectingAndThen (Collectors.toMap (data -> data [0], data -> data [1]), Collections :: unmodifiableMap));

Merk at vi bør unngå å bruke slik initialisering ved hjelp av Strømmer, da det kan føre til en enorm ytelse overhead og mange søppelobjekter blir opprettet bare for å initialisere kartet.

5. Java 9-veien

Java 9 kommer med forskjellige fabrikkmetoder i Kart grensesnitt som forenkler opprettelse og initialisering av uforanderlige kart.

La oss gå videre og se på disse fabrikkmetodene.

5.1. Map.of ()

Denne fabrikkmetoden tar ingen argumenter, et enkelt argument og variable argumenter:

Map emptyMap = Map.of (); Map singletonMap = Map.of ("key1", "value"); Map map = Map.of ("key1", "value1", "key2", "value2");

Merk at denne metoden bare støtter maksimalt 10 nøkkelverdipar.

5.2. Map.ofEntries ()

Det ligner på Map.of () men har ingen begrensninger på antall nøkkelverdipar:

Map map = Map.ofEntries (new AbstractMap.SimpleEntry ("name", "John"), new AbstractMap.SimpleEntry ("city", "budapest"), new AbstractMap.SimpleEntry ("zip", "000000"), new AbstractMap.SimpleEntry ("hjem", "1231231231");

Merk at fabrikkmetodene produserer uforanderlige kart, derfor vil enhver mutasjon resultere i a Ikke-støttetOperationException.

De tillater heller ikke nullnøkler eller dupliserte nøkler.

Nå hvis vi trenger et foranderlig eller voksende kart etter initialisering, kan vi lage noen av implementeringene av Kart grensesnitt og passere disse uforanderlige kartene i konstruktøren:

Map map = new HashMap (Map.of ("key1", "value1", "key2", "value2")); Map map2 = new HashMap (Map.ofEntries (new AbstractMap.SimpleEntry ("name", "John"), new AbstractMap.SimpleEntry ("city", "budapest")));

6. Bruke Guava

Når vi har sett på måtene å bruke kjernen i Java, la oss gå videre og initialisere et kart ved hjelp av Guava-biblioteket:

Kartartikler = ImmutableMap.of ("Tittel", "Min nye artikkel", "Tittel2", "Andre artikkel");

Dette vil skape et uforanderlig kart, og å skape et foranderlig kart:

Kartartikler = Maps.newHashMap (ImmutableMap.of ("Tittel", "Min nye artikkel", "Tittel2", "Andre artikkel"));

Metoden ImmutableMap.of () har også overbelastede versjoner som kan ta opptil 5 par nøkkelverdiparametere. Slik ser et eksempel med to par parametere ut:

ImmutableMap.of ("key1", "value1", "key2", "value2");

7. Konklusjon

I denne artikkelen undersøkte vi de forskjellige måtene å initialisere a Kart, spesielt for å lage tomme, singleton, uforanderlige og foranderlige kart. Som vi kan se, er det en enorm forbedring på dette feltet siden Java 9.

Eksempelkildekoden ligger som alltid i Github-prosjektet. Java 9-eksemplene ligger her, og Guava-prøven her.


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