Initialiser et HashMap i Java

1. Oversigt

I denne vejledning lærer vi om forskellige måder at initialisere en HashMap i Java.

Vi bruger Java 8 såvel som Java 9.

2. Den statiske initialisering af en statisk HashMap

Vi kan initialisere en HashMap ved hjælp af en statisk blok af kode:

offentlig statisk kortartikelMapOne; statisk {articleMapOne = nyt HashMap (); articleMapOne.put ("ar01", "Intro to Map"); articleMapOne.put ("ar02", "En eller anden artikel"); }

Fordelen ved denne form for initialisering er, at kortet kan ændres, men det fungerer kun for statisk. Derfor kan poster tilføjes og fjernes efter behov.

Lad os gå videre og teste det:

@Test offentlig ugyldighed givenStaticMap_whenUpdated_thenCorrect () {MapInitializer.articleMapOne.put ("NewArticle1", "Konverter array til liste"); assertEquals (MapInitializer.articleMapOne.get ("NewArticle1"), "Konverter array til liste"); }

Vi kan også initialisere kortet ved hjælp af syntaksen med dobbeltafstivning:

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

Noter det vi må forsøge at undgå denne initialiseringsteknik, fordi den skaber en anonym ekstra klasse ved hver brug, har skjulte referencer til det vedlagte objekt, og kan forårsage hukommelseslækage.

3. Brug af Java-samlinger

Hvis vi har brug for at oprette et uforanderligt kort med en enkelt post, Collections.singletonMap () bliver meget nyttigt:

offentligt statisk kort createSingletonMap () {returner Collections.singletonMap ("brugernavn1", "password1"); }

Bemærk, at kortet her er uforanderligt, og hvis vi prøver at tilføje flere poster, vil det smide java.lang.UnderstøttetOperationException.

Vi kan også oprette et uforanderligt tomt kort ved hjælp af Collections.emptyMap ():

Kort tomMap = Collections.emptyMap ();

4. Java 8-måde

I dette afsnit skal vi se på måderne til at initialisere et kort ved hjælp af Java 8 Stream API.

4.1. Ved brug af Collectors.toMap ()

Lad os bruge en Strøm af en to-dimensionel Snor array og samle dem på et kort:

Kortkort = Stream.of (ny streng [] [] {{"Hej", "Verden"}, {"John", "Doe"},}). Indsaml (Collectors.toMap (data -> data [0] , data -> data [1]));

Bemærk her datatypen af ​​nøgle og værdi af Kort er den samme.

For at gøre det mere generisk, lad os tage rækkevidden af Objekter og udføre den samme handling:

 Kortkort = Stream.of (nyt objekt [] [] {{"data1", 1}, {"data2", 2},}). Indsaml (Collectors.toMap (data -> (streng) data [0], data -> (Heltal) data [1]));

Som et resultat opretter vi et kort over nøglen som en Snor og værdi som en Heltal.

4.2. Brug af en strøm af Kort. Indgang

Her bruger vi forekomsterne af Kort. Indgang. Dette er en anden tilgang, hvor vi har forskellige nøgle- og værdityper.

Lad os først bruge SimpleEntry gennemførelse af Indgang grænseflade:

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

Lad os nu oprette kortet ved hjælp af SimpleImmutableEntry implementering:

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. Initialisering af et uforanderligt kort

I visse brugstilfælde er vi nødt til at initialisere et uforanderligt kort. Dette kunne gøres ved at indpakke Collectors.toMap () inde Collectors.collectingAndThen ():

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

Bemærk, at vi bør undgå at bruge en sådan initialisering ved hjælp af Strømme, da det kan forårsage en enorm præstationsomkostning, og der oprettes masser af affaldsobjekter bare for at initialisere kortet.

5. Java 9-vejen

Java 9 leveres med forskellige fabriksmetoder i Kort interface, der forenkler oprettelsen og initialiseringen af ​​uforanderlige kort.

Lad os gå videre og se på disse fabriksmetoder.

5.1. Map.of ()

Denne fabriksmetode tager intet argument, et enkelt argument og variable argumenter:

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

Bemærk, at denne metode kun understøtter maksimalt 10 nøgleværdipar.

5.2. Map.ofEntries ()

Det ligner Map.of () men har ingen begrænsninger for antallet af nøgleværdipar:

Kortkort = Map.ofEntries (nyt AbstractMap.SimpleEntry ("navn", "John"), nyt AbstractMap.SimpleEntry ("by", "budapest"), nyt AbstractMap.SimpleEntry ("zip", "000000"), nyt AbstractMap.SimpleEntry ("hjem", "1231231231"));

Bemærk, at fabriksmetoderne producerer uforanderlige kort, hvorfor enhver mutation vil resultere i en Ikke-understøttetOperationException.

De tillader heller ikke nøgler eller duplikerede nøgler.

Hvis vi nu har brug for et ændret eller voksende kort efter initialisering, kan vi oprette nogen af ​​implementeringerne af Kort interface og videregive disse uforanderlige kort i konstruktøren:

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

6. Brug af Guava

Da vi har undersøgt måderne til at bruge core Java, lad os gå videre og initialisere et kort ved hjælp af Guava-biblioteket:

Kortartikler = ImmutableMap.of ("Titel", "Min nye artikel", "Titel2", "Anden artikel");

Dette ville skabe et uforanderligt kort og skabe et ændret kort:

Kortartikler = Maps.newHashMap (ImmutableMap.of ("Titel", "Min nye artikel", "Titel2", "Anden artikel"));

Metoden ImmutableMap.of () har også overbelastede versioner, der kan tage op til 5 par nøgleværdiparametre. Sådan ser et eksempel med 2 par parametre ud:

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

7. Konklusion

I denne artikel undersøgte vi de forskellige måder at initialisere en Kort, især for at oprette tomme, singleton, uforanderlige og ændrede kort. Som vi kan se, er der en enorm forbedring på dette område siden Java 9.

Som altid er prøvekildekoden placeret i Github-projektet. Java 9-eksemplerne findes her, og Guava-prøven her.