Peta. Mereka mungkin tidak mempunyai khazanah tersembunyi atau menandai tempat "X" dalam pencarian emas anda, tetapi ia adalah harta karun dalam pembangunan Java. Sama ada anda seorang pembangun berwajah baru atau arkitek berpengalaman dengan papan kekunci yang diwarnai kopi, pemahaman Peta akan meningkatkan permainan pengekodan anda. Mari kita mulakan perjalanan epik melalui setiap sudut dan ceruk Peta di Jawa.
Dalam istilah mudah, Peta ialah struktur data yang menyimpan pasangan nilai kunci. Fikirkannya seperti kamus dunia sebenar: anda mempunyai perkataan (kunci) dan maknanya (nilai). Setiap kunci dalam Peta mestilah unik, tetapi nilai boleh diduplikasi.
Caching : Simpan hasil carian untuk mengelakkan pengiraan berulang.
Pengindeksan pangkalan data : Akses pantas kepada data dengan kunci utama.
Konfigurasi : Simpan tetapan dan pilihan sebagai pasangan nilai kunci.
Mengira Frekuensi : Kira kejadian unsur (cth., frekuensi perkataan).
Peta bersinar dalam senario di mana pencarian pantas, sisipan dan kemas kini diperlukan. Ia digunakan untuk memodelkan hubungan yang pengecam unik (kunci) dikaitkan dengan entiti tertentu (nilai).
Java menyediakan pelbagai Peta untuk memenuhi keperluan yang berbeza:
3.1 HashMap
Pelaksanaan : Menggunakan jadual cincang .
Prestasi : O(1) purata masa untuk operasi dapatkan dan letak.
Ciri-ciri : Tidak tertib dan membenarkan satu kunci nol dan berbilang nilai nol.
Reka Letak Memori : Kekunci disimpan dalam pelbagai baldi; setiap baldi ialah senarai terpaut atau pokok (jika perlanggaran melebihi ambang).
3.2 LinkedHashMap
Pelaksanaan : Memanjangkan HashMap dengan senarai terpaut untuk mengekalkan tertib sisipan .
Kes Penggunaan : Apabila susunan entri perlu dikekalkan (cth., cache LRU).
Prestasi : Rendah sedikit daripada HashMap disebabkan senarai terpaut di atas kepala.
3.3 Peta Pokok
Pelaksanaan : Menggunakan Pokok Merah-Hitam (sejenis pokok carian binari seimbang).
Prestasi : O(log n) untuk mendapatkan, meletakkan dan mengeluarkan operasi.
Ciri : Diisih mengikut susunan semula jadi kunci atau Pembanding tersuai.
3.4 Hashtable
Isyarat Sejarah Purba : Peninggalan zaman awal Java, disegerakkan dan selamat untuk benang, tetapi dengan penalti prestasi yang berat.
Ciri : Tidak membenarkan kekunci atau nilai nol.
3.5 ConcurrentHashMap
Wira selamat benang : Direka untuk akses serentak tanpa mengunci seluruh peta.
Pelaksanaan : Menggunakan mekanisme penguncian berasaskan segmen.
Prestasi : Menyediakan daya pemprosesan yang tinggi di bawah akses baca-tulis serentak.
4.1 HashMap secara Mendalam
Cincang : Kekunci dihantar ke fungsi cincang, yang mengembalikan indeks dalam tatasusunan (baldi).
Resolusi Perlanggaran : Apabila berbilang kunci menghasilkan indeks cincang yang sama:
int hash = key.hashCode() ^ (key.hashCode() >>> 16); int index = hash & (n - 1); // n is the size of the array (usually a power of 2)
4.2 TreeMap Dalaman
Pokok Merah-Hitam : Pokok pengimbangan diri memastikan laluan terpanjang dari akar ke daun tidak lebih daripada dua kali lebih panjang daripada laluan terpendek.
Pemesanan : Isih kunci secara automatik sama ada dalam susunan semula jadi atau berdasarkan Pembanding.
4.3 Mekanik ConcurrentHashMap
Pengunci Baldi : Menggunakan kunci berbutir halus pada segmen berasingan untuk menambah baik keselarasan.
Kecekapan Memori : Menggunakan gabungan tatasusunan dan nod terpaut.
Mari kita lihat kaedah yang paling biasa digunakan dengan coretan kod ringkas:
5.1 meletakkan(kunci K, nilai V)
Memasukkan atau mengemas kini pasangan nilai kunci.
Map<String, Integer> map = new HashMap<>(); map.put("Alice", 30); map.put("Bob", 25);
5.2 dapatkan(kunci objek)
Mendapatkan semula nilai yang dikaitkan dengan kunci.
int age = map.get("Alice"); // 30
5.3 mengandungi Kekunci(Kunci objek)
Menyemak sama ada peta mengandungi kunci tertentu.
boolean exists = map.containsKey("Bob"); // true
5.4 alih keluar(Kunci objek)
Mengalih keluar pemetaan untuk kunci tertentu.
map.remove("Bob");
5.5 entrySet(), keySet(), values()
Berulang ke atas entri, kunci atau nilai.
for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); }
HashMap berstruktur di sekeliling baldi (tatasusunan). Setiap baldi menunjuk kepada sama ada:
Satu Penyertaan
Struktur senarai/pokok terpaut (ada perlanggaran).
Jika key1 dan key2 mempunyai cincangan yang sama, mereka masuk ke baldi yang sama:
Sebelum Java 8 : Senarai terpaut.
Java 8 : Menukar kepada pokok apabila bilangan elemen dalam baldi melebihi ambang.
Perwakilan Visual :
int hash = key.hashCode() ^ (key.hashCode() >>> 16); int index = hash & (n - 1); // n is the size of the array (usually a power of 2)
Penggunaan biasa dalam algoritma seperti pembilang kekerapan perkataan atau kiraan aksara dalam rentetan.
Map<String, Integer> map = new HashMap<>(); map.put("Alice", 30); map.put("Bob", 25);
int age = map.get("Alice"); // 30
Bila hendak menggunakan Peta :
Tugas yang berat mencari : Jika anda memerlukan kerumitan masa O(1).
Masalah Kiraan dan Kekerapan : Biasa dalam pengaturcaraan kompetitif.
Caching dan Memoisasi : Peta boleh digunakan untuk cache hasil untuk pengaturcaraan dinamik.
Memandangkan tatasusunan integer, kembalikan indeks bagi dua nombor yang ditambah kepada sasaran tertentu.
boolean exists = map.containsKey("Bob"); // true
Apabila menggunakan Integer sebagai kunci, ingat bahawa Java menyimpan integer dari -128 hingga 127. Di luar julat itu, kunci mungkin dikotak-kotak secara berbeza, yang membawa kepada ketidakcekapan.
Untuk penalaan prestasi, ganti hashCode() dengan berhati-hati:
map.remove("Bob");
Menggunakan objek boleh ubah sebagai kunci adalah amalan buruk . Jika objek utama berubah, ia mungkin tidak boleh diperoleh semula.
Perhubungan Nilai Utama : Jika masalah mempunyai perhubungan di mana satu item dipetakan kepada yang lain.
Pengiraan Pendua : Kesan elemen berulang.
Pendapatan Data Pantas : Apabila carian O(1) diperlukan.
Peta ialah salah satu struktur data yang paling serba boleh dan berkuasa di Jawa. Sama ada HashMap untuk kegunaan umum, TreeMap untuk data diisih atau ConcurrentHashMap untuk concurrency, mengetahui yang mana untuk digunakan dan cara ia beroperasi akan membantu anda menulis kod yang lebih baik dan lebih cekap.
Jadi, apabila seseorang bertanya kepada anda tentang Peta, anda boleh tersenyum, menghirup kopi anda dan memberitahu mereka, "Di manakah anda mahu saya mulakan?"
Atas ialah kandungan terperinci Penyelaman Dalam Peta Java: Panduan Terbaik untuk Semua Pembangun. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!