Inisialisasi HashMap di Java

1. Ikhtisar

Dalam tutorial ini, kita akan belajar tentang berbagai cara menginisialisasi HashMap di Java.

Kami akan menggunakan Java 8 serta Java 9.

2. Penginisialisasi Statis untuk HashMap Statis

Kita dapat menginisialisasi HashMap menggunakan blok kode statis :

public static Map articleMapOne; static { articleMapOne = new HashMap(); articleMapOne.put("ar01", "Intro to Map"); articleMapOne.put("ar02", "Some article"); }

Keuntungan dari inisialisasi semacam ini adalah peta dapat berubah, tetapi hanya akan berfungsi untuk statis. Akibatnya, entri dapat ditambahkan dan dihapus jika diperlukan.

Mari lanjutkan dan uji:

@Test public void givenStaticMap_whenUpdated_thenCorrect() { MapInitializer.articleMapOne.put( "NewArticle1", "Convert array to List"); assertEquals( MapInitializer.articleMapOne.get("NewArticle1"), "Convert array to List"); }

Kita juga dapat menginisialisasi peta menggunakan sintaks tanda kurung ganda:

Map doubleBraceMap = new HashMap() {{ put("key1", "value1"); put("key2", "value2"); }};

Perhatikan bahwa kita harus mencoba menghindari teknik inisialisasi ini karena teknik ini membuat kelas tambahan anonim di setiap penggunaan, menyimpan referensi tersembunyi ke objek penutup, dan dapat menyebabkan masalah kebocoran memori.

3. Menggunakan Koleksi Java

Jika kita perlu membuat peta permanen tunggal dengan satu entri, Collections.singletonMap () menjadi sangat berguna:

public static Map createSingletonMap() { return Collections.singletonMap("username1", "password1"); }

Perhatikan bahwa peta di sini tidak dapat diubah, dan jika kita mencoba menambahkan lebih banyak entri, itu akan menampilkan java.lang.UnsupportedOperationException.

Kita juga bisa membuat peta kosong yang tidak bisa diubah dengan menggunakan Collections.emptyMap ():

Map emptyMap = Collections.emptyMap();

4. Java 8 Way

Di bagian ini, mari kita lihat cara untuk menginisialisasi peta menggunakan Java 8 Stream API.

4.1. Menggunakan Collectors.toMap ()

Mari gunakan Stream dari array String dua dimensi dan kumpulkan menjadi peta:

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

Perhatikan di sini tipe data key dan value dari Map adalah sama.

Untuk membuatnya lebih umum, mari kita ambil array Objects dan melakukan operasi yang sama:

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

Hasilnya, kami membuat peta kunci sebagai String dan nilai sebagai Integer .

4.2. Menggunakan Stream of Map.Entry

Di sini kita akan menggunakan contoh Map.Entry. Ini adalah pendekatan lain di mana kami memiliki jenis kunci dan nilai yang berbeda.

Pertama, mari gunakan implementasi SimpleEntry dari antarmuka Entri :

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

Sekarang mari buat peta menggunakan implementasi SimpleImmutableEntry :

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. Menginisialisasi Peta yang Tidak Dapat Diubah

Dalam kasus penggunaan tertentu, kita perlu menginisialisasi peta yang tidak dapat diubah. Ini bisa dilakukan dengan membungkus Collectors.toMap () di dalam 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));

Perhatikan bahwa kita harus menghindari penggunaan inisialisasi menggunakan Streams, karena dapat menyebabkan overhead performa yang sangat besar dan banyak objek sampah dibuat hanya untuk menginisialisasi peta.

5. The Java 9 Way

Java 9 hadir dengan berbagai metode pabrik dalam antarmuka Peta yang menyederhanakan pembuatan dan inisialisasi peta yang tidak dapat diubah.

Mari kita lanjutkan dan lihat metode pabrik ini.

5.1. Peta dari()

Metode pabrik ini tidak membutuhkan argumen, satu argumen, dan argumen variabel:

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

Perhatikan bahwa metode ini hanya mendukung maksimal 10 pasangan nilai kunci.

5.2. Map.ofEntries ()

Ini mirip dengan Map.of () tetapi tidak memiliki batasan pada jumlah pasangan kunci-nilai:

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

Perhatikan bahwa metode pabrik menghasilkan peta yang tidak dapat diubah, sehingga mutasi apa pun akan menghasilkan UnsupportedOperationException.

Juga, mereka tidak mengizinkan kunci nol atau kunci duplikat.

Sekarang jika kita membutuhkan peta yang bisa berubah atau berkembang setelah inisialisasi, kita bisa membuat salah satu implementasi dari antarmuka Map dan meneruskan peta yang tidak bisa diubah ini di konstruktor:

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. Menggunakan Jambu Biji

Saat kita telah mempelajari cara menggunakan inti Java, mari kita lanjutkan dan menginisialisasi peta menggunakan pustaka Guava:

Map articles = ImmutableMap.of("Title", "My New Article", "Title2", "Second Article");

Ini akan membuat peta yang tidak bisa diubah, dan untuk membuat peta yang bisa berubah:

Map articles = Maps.newHashMap(ImmutableMap.of("Title", "My New Article", "Title2", "Second Article"));

Metode ImmutableMap.of () juga memiliki versi kelebihan muatan yang dapat memerlukan hingga 5 pasang parameter nilai kunci. Berikut contoh tampilan 2 pasang parameter:

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

7. Kesimpulan

Dalam artikel ini kami mengeksplorasi berbagai cara untuk menginisialisasi Peta , terutama untuk membuat peta kosong, tunggal, tidak dapat diubah, dan dapat diubah. Seperti yang bisa kita lihat, ada peningkatan besar di bidang ini sejak Java 9.

Seperti biasa, kode sumber sampel terletak di proyek Github. Contoh Java 9 ada di sini, dan contoh Jambu biji di sini.