1. Gambaran keseluruhan
Dalam tutorial ini, kita akan belajar membina peta dengan kunci dan nilai primitif.
Seperti yang kita ketahui, Java Map inti tidak membenarkan penyimpanan kunci atau nilai primitif. Itulah sebabnya kami akan memperkenalkan beberapa perpustakaan pihak ketiga luaran yang menyediakan pelaksanaan peta primitif.
2. Koleksi Gerhana
Eclipse Collections adalah kerangka koleksi berprestasi tinggi untuk Java . Ini menyediakan pelaksanaan yang lebih baik serta beberapa struktur data tambahan, termasuk beberapa koleksi primitif.
2.1. Peta yang Boleh Diubah dan Tidak Berubah
Mari buat peta kosong di mana kedua-dua kunci dan nilai adalah int primitif . Untuk itu, kami akan menggunakan kelas kilang IntIntMaps :
MutableIntIntMap mutableIntIntMap = IntIntMaps.mutable.empty();
The IntIntMaps kelas kilang adalah cara yang paling mudah untuk membuat peta primitif . Ini membolehkan kita membuat contoh yang boleh berubah dan tidak berubah dari jenis peta yang diinginkan. Dalam contoh kami, kami membuat contoh IntIntMap yang dapat diubah . Begitu juga, kita boleh membuat satu contoh yang tidak boleh berubah dengan hanya menggantikan IntIntMaps.mutable panggilan kilang statik dengan IntIntMaps.immutable :
ImmutableIntIntMap immutableIntIntMap = IntIntMaps.immutable.empty();
Oleh itu, mari kita tambahkan kunci, pasangan nilai ke peta yang boleh berubah:
mutableIntIntMap.addToValue(1, 1);
Begitu juga, kita dapat membuat peta campuran dengan rujukan dan pasangan kunci-nilai jenis primitif. Mari buat peta dengan kekunci String dan nilai berganda :
MutableObjectDoubleMap dObject = ObjectDoubleMaps.mutable.empty();
Di sini, kami menggunakan kelas kilang ObjectDoubleMaps untuk membuat contoh yang dapat diubah untuk MutableObjectDoubleMap .
Sekarang mari kita tambahkan beberapa entri:
dObject.addToValue("price", 150.5); dObject.addToValue("quality", 4.4); dObject.addToValue("stability", 0.8);
2.2. Pokok API Primitif
Dalam Eclipse Collections, terdapat antara muka asas yang disebut PrimitiveIterable. Ini adalah antara muka asas untuk setiap bekas primitif perpustakaan. Semua diberi nama PrimitiveTypeIterable , di mana PrimitiveType boleh berupa Int, Long , Short , Byte , Char , Float , Double , atau Boolean .
Semua antara muka asas ini, pada gilirannya, mempunyai pohon pelaksanaan XY Map , yang dibahagi sama ada peta itu boleh berubah atau tidak berubah . Sebagai contoh, untuk IntIntMap , kami mempunyai MutableIntIntMap dan ImmutableIntIntMap .
Akhirnya, seperti yang kita lihat di atas, kita mempunyai antara muka untuk merangkumi semua jenis kombinasi jenis untuk kunci dan nilai untuk kedua-dua nilai primitif dan objek . Jadi, sebagai contoh, kita boleh memiliki IntObjectMap untuk kunci primitif dengan nilai Objek atau ObjectIntMap untuk kes sebaliknya.
3. HPPC
HPPC adalah perpustakaan yang ditujukan untuk prestasi tinggi dan kecekapan memori. Ini bermaksud bahawa perpustakaan kurang mendapat penarikan berbanding yang lain. Walau bagaimanapun, ini mempunyai manfaat untuk mendedahkan orang dalaman kepada manipulasi tahap rendah yang berguna. Ia menyediakan peta dan set.
3.1. Contoh Mudah
Mari mulakan dengan membuat peta yang mempunyai kunci int dan nilai panjang . Menggunakan ini agak biasa:
IntLongHashMap intLongHashMap = new IntLongHashMap(); intLongHashMap.put(25, 1L); intLongHashMap.put(150, Long.MAX_VALUE); intLongHashMap.put(1, 0L); intLongHashMap.get(150);
HPPC menyediakan peta untuk semua kombinasi kunci dan nilai:
- Kunci primitif dan nilai primitif
- Nilai primitif dan jenis objek
- Kekunci jenis objek dan nilai primitif
- Kedua-dua kunci dan nilai Objek
Peta jenis objek menyokong generik:
IntObjectOpenHashMap ObjectIntOpenHashMap
Peta pertama mempunyai kunci int primitif dan nilai BigDecimal . Peta kedua mempunyai LocalDate untuk kunci dan int untuk nilainya
3.2. Peta Hash vs Peta Penyebaran
Oleh kerana cara pencucian kunci dan fungsi pengagihan dilaksanakan secara tradisional, kami mungkin bertabrakan ketika mencuci kunci. Bergantung pada bagaimana kunci diedarkan, ini boleh menyebabkan masalah prestasi pada peta besar. Secara lalai, HPPC melaksanakan penyelesaian yang dapat mengelakkan masalah ini.
Namun, masih ada tempat untuk peta yang mempunyai fungsi pengedaran yang lebih sederhana. Ini berguna sekiranya peta digunakan sebagai jadual pencarian atau untuk menghitung, atau jika peta tersebut tidak memerlukan banyak operasi tulis setelah dimuat . HHPC menyediakan Peta Penyebaran untuk meningkatkan prestasi.
Semua kelas peta sebar mengekalkan konvensyen penamaan yang sama dengan peta, tetapi sebaliknya menggunakan perkataan Scatter :
- IntScatterSet
- Peta IntIntScatter
- Peta IntObjectScatter
4. Fastutil
Fastutil adalah rangka kerja cepat dan padat yang menyediakan koleksi khusus jenis termasuk peta jenis primitif.
4.1. Contoh Pantas
Sama dengan Eclipse Collections dan HPPC. Fastutil juga menyediakan peta gabungan primitif-ke-primitif dan primitif-ke-Objek.
Let's create an int to boolean map:
Int2BooleanMap int2BooleanMap = new Int2BooleanOpenHashMap();
And now, let's add some entries:
int2BooleanMap.put(1, true); int2BooleanMap.put(7, false); int2BooleanMap.put(4, true);
Then, we can retrieve values from it:
boolean value = int2BooleanMap.get(1);
4.2. In-Place Iteration
Standard JVM collections that implement the Iterable interface usually create a fresh temporary iterator object at each iteration step. With huge collections, this can create a garbage collection issue.
Fastutil provides an alternative that greatly mitigates this:
Int2FloatMap map = new Int2FloatMap(); //Add keys here for(Int2FloatMap.Entry e : Fastutil.fastIterable(map)) { //e will be reused on each iteration, so it will be only one object }
Fastutil also provides the fastForeach method. This will take a Consumer functional interface and perform a lambda-expression for each loop:
Int2FloatMap map = new Int2FloatMap(); //Add keys here Int2FloatMaps.fastForEach(map , e -> { // e is also reused across iterations });
This is very similar to the standard Java foreach construct:
Int2FloatMap map = new Int2FloatMap(); //Add keys here map.forEach((key,value) -> { // use each key/value entry });
5. Conclusion
Dalam artikel ini, kami belajar bagaimana membuat peta primitif di Java menggunakan Eclipse Collections, HPPC, dan Fastutil .
Seperti biasa, contoh kod untuk artikel ini terdapat di GitHub.