1. Gambaran keseluruhan
Dalam tutorial ini, kita akan belajar tentang pelbagai cara memulakan HashMap di Java.
Kami akan menggunakan Java 8 dan juga Java 9.
2. Content pengasal yang statik HashMap
Kita boleh memulakan HashMap menggunakan blok kod statik :
public static Map articleMapOne; static { articleMapOne = new HashMap(); articleMapOne.put("ar01", "Intro to Map"); articleMapOne.put("ar02", "Some article"); }
Kelebihan inisialisasi seperti ini ialah peta tidak berubah, tetapi hanya akan berfungsi secara statik. Akibatnya, entri dapat ditambahkan dan dikeluarkan apabila diperlukan.
Mari teruskan dan mengujinya:
@Test public void givenStaticMap_whenUpdated_thenCorrect() { MapInitializer.articleMapOne.put( "NewArticle1", "Convert array to List"); assertEquals( MapInitializer.articleMapOne.get("NewArticle1"), "Convert array to List"); }
Kami juga dapat menginisialisasi peta menggunakan sintaks pendakap dua:
Map doubleBraceMap = new HashMap() {{ put("key1", "value1"); put("key2", "value2"); }};
Perhatikan bahawa kita mesti berusaha menghindari teknik inisialisasi ini kerana ia menghasilkan kelas tambahan tanpa nama pada setiap penggunaan, menyimpan rujukan tersembunyi ke objek yang dilampirkan, dan mungkin menyebabkan masalah kebocoran memori.
3. Menggunakan Koleksi Java
Sekiranya kita perlu membuat peta tunggal yang tidak berubah dengan satu entri, Collections.singletonMap () menjadi sangat berguna:
public static Map createSingletonMap() { return Collections.singletonMap("username1", "password1"); }
Perhatikan bahawa peta di sini tidak berubah, dan jika kita cuba menambah lebih banyak entri, ia akan membuang java.lang.UnsupportedOperationException.
Kita juga boleh membuat peta kosong yang tidak berubah dengan menggunakan Collections.emptyMap ():
Map emptyMap = Collections.emptyMap();
4. Jalan Java 8
Di bahagian ini, mari kita cari cara untuk menginisialisasi peta menggunakan Java 8 Stream API.
4.1. Menggunakan Collectors.toMap ()
Mari gunakan Aliran rentetan rentetan dua dimensi dan kumpulkan ke dalam peta:
Map map = Stream.of(new String[][] { { "Hello", "World" }, { "John", "Doe" }, }).collect(Collectors.toMap(data -> data[0], data -> data[1]));
Perhatikan di sini jenis data kunci dan nilai Peta adalah sama.
Untuk menjadikannya lebih generik, mari ambil susunan Objek 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 Aliran Peta. Kemasukan
Di sini kita akan menggunakan contoh Map.Entry. Ini adalah pendekatan lain di mana kita mempunyai jenis kunci dan nilai yang berbeza.
Pertama, mari kita gunakan pelaksanaan SimpleEntry antara muka Entry :
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 pelaksanaan 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. Memulakan Peta yang Tidak Berubah
Dalam kes penggunaan tertentu, kita perlu menginisialisasi peta yang tidak berubah. Ini dapat 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 bahawa kita harus menghindari penggunaan inisialisasi seperti itu menggunakan Aliran, kerana ia dapat menyebabkan kinerja yang besar di atas kepala dan banyak benda sampah dibuat hanya untuk menginisialisasi peta.
5. Jalan 9 Java
Java 9 hadir dengan pelbagai kaedah kilang di antara muka Peta yang mempermudah pembuatan dan inisialisasi peta yang tidak berubah.
Mari maju dan melihat kaedah kilang ini.
5.1. Peta.of ()
This factory method takes no argument, a single argument, and variable arguments:
Map emptyMap = Map.of(); Map singletonMap = Map.of("key1", "value"); Map map = Map.of("key1","value1", "key2", "value2");
Note that this method supports only a maximum of 10 key-value pairs.
5.2. Map.ofEntries()
It's similar to the Map.of() but has no limitations on the number of key-value pairs:
Map map = Map.ofEntries( new AbstractMap.SimpleEntry("name", "John"), new AbstractMap.SimpleEntry("city", "budapest"), new AbstractMap.SimpleEntry("zip", "000000"), new AbstractMap.SimpleEntry("home", "1231231231") );
Note that the factory methods produce immutable maps, hence any mutation will result in a UnsupportedOperationException.
Also, they do not allow null keys or duplicate keys.
Now if we need a mutable or growing map after initialization, we can create any of the implementations of the Map interface and pass these immutable maps in the constructor:
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. Using Guava
As we've looked into the ways of using core Java, let's move ahead and initialize a map using the Guava library:
Map articles = ImmutableMap.of("Title", "My New Article", "Title2", "Second Article");
Ini akan membuat peta yang tidak berubah, dan untuk membuat peta yang dapat diubah:
Map articles = Maps.newHashMap(ImmutableMap.of("Title", "My New Article", "Title2", "Second Article"));
Kaedah ImmutableMap.of () juga mempunyai versi berlebihan yang dapat mengambil hingga 5 pasang parameter nilai-kunci. Inilah contoh contoh 2 pasang parameter:
ImmutableMap.of("key1", "value1", "key2", "value2");
7. Kesimpulannya
Dalam artikel ini, kami meneroka pelbagai cara untuk menginisialisasi Peta , terutama untuk membuat peta kosong, tunggal, tidak berubah dan berubah. Seperti yang kita lihat, ada peningkatan besar dalam bidang ini sejak Java 9.
Seperti biasa, contoh kod sumber terletak di projek Github. Contoh Java 9 terdapat di sini, dan contoh Jambu di sini.