Ako priamo inicializovať HashMap (doslovným spôsobom)?

Existuje nejaký spôsob, ako takto inicializovať mapu Java HashMap?:

Map<String,String> test = 
    new HashMap<String, String>{"test":"test","test":"test"};

Aká by bola správna syntax? Nenašiel som nič, čo by sa toho týkalo. Je to možné? Hľadám najkratší/najrýchlejší spôsob, ako do mapy vložiť nejaké "konečné/statické" hodnoty, ktoré sa nikdy nemenia a sú vopred známe pri vytváraní mapy.

Riešenie

Pre Javu verzie 9 alebo vyššej:

Áno, teraz je to možné. V Jave 9 bolo pridaných niekoľko továrenských metód, ktoré zjednodušujú vytváranie máp :

// this works for up to 10 elements:
Map test1 = Map.of(
    "a", "b",
    "c", "d"
);

// this works for any number of elements:
Map test2 = Map.ofEntries(
    entry("a", "b"),
    entry("c", "d")
);

Vo vyššie uvedenom príklade budú test aj test2 rovnaké, len s rôznymi spôsobmi vyjadrenia mapy. Metóda Map.of je definovaná pre maximálne desať prvkov v mape, zatiaľ čo metóda Map.ofEntries nebude mať takéto obmedzenie.

Všimnite si, že v tomto prípade bude výsledná mapa nemenná mapa. Ak chcete, aby bola mapa mutovateľná, môžete ju opäť skopírovať, napr. pomocou príkazu mutableMap = new HashMap(Map.of("a", "b"));

(Pozri tiež JEP 269 a Javadoc)

Až do verzie Java 8:

Nie, všetky prvky budete musieť pridať ručne. Môžete použiť inicializátor v anonymnej podtriede, aby bola syntax o niečo kratšia:

Map myMap = new HashMap() {{
        put("a", "b");
        put("c", "d");
    }};

Anonymná podtrieda však môže v niektorých prípadoch zaviesť neželané správanie. Patrí sem napr:

  • generuje ďalšiu triedu, ktorá zvyšuje spotrebu pamäte, spotrebu miesta na disku a čas spustenia
  • V prípade nestatickej metódy: Drží referenciu na objekt, na ktorý bola metóda vytvárania zavolaná. To znamená, že objekt vonkajšej triedy nie je možné vysypať, kým sa na vytvorený objekt mapy stále odkazuje, čím sa blokuje ďalšia pamäť

Použitie funkcie na inicializáciu vám tiež umožní vytvoriť mapu v inicializátore, ale vyhnete sa nepríjemným vedľajším účinkom:

Map myMap = createMap();

private static Map createMap() {
    Map myMap = new HashMap();
    myMap.put("a", "b");
    myMap.put("c", "d");
    return myMap;
}
Komentáre (13)

Toto je jeden zo spôsobov.

HashMap h = new HashMap() {{
    put("a","b");
}};

Mali by ste však byť opatrní a uistiť sa, že rozumiete vyššie uvedenému kódu (vytvára novú triedu, ktorá dedí od HashMap). Preto by ste si mali prečítať viac tu: http://www.c2.com/cgi/wiki?DoubleBraceInitialization , alebo jednoducho použite Guava:

Map left = ImmutableMap.of("a", 1, "b", 2, "c", 3);
Komentáre (13)
Map test = new HashMap()
{
    {
        put(key1, value1);
        put(key2, value2);
    }
};
Komentáre (8)