JDK1.8.0_144 Alamat Unduh: //www.vevb.com/soft/551512.html
AbstractMap Abstract Class mengimplementasikan beberapa metode sederhana dan umum, yang tidak sulit dengan sendirinya. Tetapi ada dua metode dalam kelas abstrak ini yang patut diperhatikan. Implementasi Kode Sumber Metode Keyset dan Nilai dapat dikatakan sebagai model gaya buku teks.
Kelas abstrak biasanya diimplementasikan sebagai kerangka untuk mengimplementasikan metode umum untuk subkelas masing -masing. Dalam artikel sebelumnya, kami menjelaskan antarmuka peta, dan artikel ini menganalisis dan mempelajari kelas abstrak abstrak.
Ada cukup banyak struktur data jenis peta di Java. AbstractMap, sebagai implementasi kerangka mereka, mengimplementasikan beberapa metode antarmuka peta, yaitu, ia menyediakan metode publik untuk subkelasnya, dan berbagai peta tanpa implementasi mungkin berbeda.
Kelas abstrak tidak dapat secara langsung membuat contoh kelas abstrak melalui kata kunci baru, tetapi dapat memiliki konstruktor. AbstractMap menyediakan konstruktor tanpa parameter tanpa yang dimodifikasi, yang berarti bahwa hanya subkelasnya yang dapat mengakses (tentu saja itu adalah kelas abstrak itu sendiri, dan kelas -kelas lain tidak dapat dipakai secara langsung), yaitu, hanya subkelasnya yang dapat menyebut konstruktor tanpa parameter ini.
Antarmuka entri didefinisikan secara internal di antarmuka peta. Antarmuka ini adalah implementasi internal dari peta peta untuk mempertahankan pasangan nilai kunci nilai kunci, dan nilai kunci disimpan dalam peta ini. AbstractMap mengimplementasikan antarmuka internal ini, ada dua secara total: satu adalah sentuhan sederhana yang dapat berubah dan yang lainnya adalah entengimeMutable yang tidak dapat diubah.
Kelas Statis Publik Sederhana <K, V> mengimplementasikan entri <K, V>, java.io.serializable
Antarmuka MAP.entry <K, V> diimplementasikan, dan dapat diserialisasi (dapat diserialisasi).
Metodenya relatif sederhana, yang semuanya adalah operasi mengambil nilai dan menyimpan nilai. Definisi nilai kunci adalah modifikasi akhir, yang berarti itu adalah referensi yang tidak dapat diubah. Selain itu, metode setValue sedikit istimewa. Nilai yang disimpan bukanlah nilai yang tersimpan, tetapi nilai lama dikembalikan. Yang perlu Anda pelajari adalah metode kode yang sama dan hashcode yang ditulisnya ulang.
Public Boolean Equals (Object O) {if (! (o Instanceof Map.ENTRY)) // Untuk menentukan apakah parameternya dari tipe MAP. Peta.entry <?,?> E = (Map.entry <?,?>) O; // Memaksa tipe objek untuk memetakan. Tipe Enterry, Parameter menggunakan "?" Alih -alih "K, V" karena jenis generik akan dihapus saat runtime. Kompiler tidak tahu apa jenis k dan v, return eq (key, e.getKey ()) && eq (value, e.getValue ()); // Kunci dan Nilai Panggilan metode EQ untuk penilaian masing -masing, dan setara sama ketika keduanya kembali. } private static boolean eq (objek o1, objek o2) {return o1 == null? o2 == null: o1.equals (o2); // Operator tiga item ini juga sangat sederhana, tetapi harus dicatat bahwa meskipun O1 dan O2 adalah tipe objek di sini, metode yang sama dari tipe objek dirujuk oleh "==", jadi jangan berpikir ada masalah di sini, karena pada kenyataannya, tipe O1 mungkin string, meskipun dikonversi menjadi objek, sehingga metode string#Equals masih dipanggil ketika memanggil metode Equals. }Untuk menulis ulang metode yang sama dengan benar dan digunakan dengan benar, Anda biasanya perlu menulis ulang metode kode hash.
hashCode int publik () {return (key == null? 0: key.hashcode ()) ^ (value == null? 0: value.hashcode ()); // Ketika nilai -nilai kunci dan nilai tidak nol, kode hash akan xored. }Kelas statis publik SimpleMutableentry <K, V> mengimplementasikan entri <k, v>, java.io.serializable SimpleMutableentry
Entri yang didefinisikan sebagai kekambuhan sebenarnya tidak dapat diubah karena tidak memberikan metode setValue, dan secara alami tidak dapat dimodifikasi melalui metode setValue ketika beberapa utas diakses secara bersamaan. Dibandingkan dengan SimpleEntry, variabel kunci dan nilainya didefinisikan sebagai tipe akhir. Memanggil metode setValue akan melempar pengecualian Exception yang tidak didukung.
Metode yang setara dan kode hash -nya konsisten dengan sentuhan sederhana.
Selanjutnya, periksa metode mana di antarmuka peta yang diimplementasikan oleh AbstractMap Abstract Class.
Ukuran int publik ()
Metode entryset didefinisikan dalam peta, yang mengembalikan koleksi set MAP.Entry. Metode ukuran koleksi set disebut langsung, yang merupakan ukuran peta.
Public Boolean isEmpty ()
Panggil metode ukuran di atas, sama dengan 0, kosong.
Publik Boolean Berisi (Kunci Objek)
Implementasi metode ini relatif sederhana. Dengan memanggil metode entri, iterator dari koleksi set diperoleh dan dilintasi dengan kunci parameter. Peta dapat disimpan sebagai nilai kunci NULL. Karena Key = NULL disimpan di peta dengan penyimpanan khusus khusus (nilai kode hash tidak dapat dihitung), kami juga telah melakukan cara untuk menentukan apakah kunci parameter kosong.
Boolean publik berisi nilai (nilai objek)
Implementasi metode ini konsisten dengan ContainsKey.
Public V Dapatkan (Kunci Objek)
Implementasi metode ini mirip dengan dua di atas, perbedaannya adalah bahwa di atas sama dengan boolean, dan metode ini mengembalikan nilainya.
Public v Put (K Key, V Nilai)
Metode menyimpan pasangan nilai kunci ke dalam peta tidak diimplementasikan secara rinci, dan ExportedOpersException yang tidak didukung akan langsung dilemparkan.
PUBLIK V Hapus (Kunci Objek)
Hapus pasangan nilai kunci-nilai kunci yang ditentukan dalam peta melalui tombol parameter. Metode ini juga sangat sederhana. Ini juga melintasi koleksi set MAP.Entry melalui iterator, menemukan nilai kunci yang sesuai, dan menghapus peta.Entry dengan memanggil metode Iterator#Remahkan.
public void putall (peta <? Extends k ,? Extends v> m)
Metode ini juga sangat sederhana untuk melintasi peta yang masuk dan memanggil metode put untuk menyimpannya.
public void clear ()
Hubungi metode entriSet untuk mendapatkan koleksi set dan kemudian hubungi metode set#clear () untuk menghapus.
set publik <k> keyset ()
Mengembalikan koleksi set nilai kunci peta. AbstractMap mendefinisikan variabel anggota "set transien <k> keyset". Dalam JDK7, variabel Keyset dimodifikasi dengan volatile, tetapi dalam JDK8, tidak dimodifikasi oleh volatile. Dijelaskan dalam komentar pada variabel Keyset bahwa metode untuk mengakses bidang -bidang ini tidak disinkronkan dengan sendirinya, dan volatile tidak dapat menjamin keamanan utas. Implementasi metode Keyset menarik.
Pertama -tama, pikirkan metode ini adalah mengembalikan set set nilai kunci. Secara alami, kita dapat memikirkan metode implementasi sederhana, melintasi array entri dan mengambil nilai kunci dan memasukkannya ke dalam set, mirip dengan kode berikut:
set publik <k> keyset () {set <k> ks = null; untuk (map.entry <k, v> entri: entryset ()) {ks.add (entry.getKey ()); } return ks;}Ini berarti bahwa setiap kali metode Keyset dipanggil, itu akan melintasi array masuk, dan efisiensi akan sangat berkurang ketika volume data besar. Saya harus mengatakan bahwa kode sumber JDK ditulis dengan sangat baik, dan tidak mengadopsi metode traversal. Jika Anda tidak melintasi entri, bagaimana Anda tahu bahwa peta telah menambahkan pasangan nilai kunci nilai kunci saat ini?
Jawabannya adalah mengimplementasikan kembali koleksi set kustom baru di dalam metode Keyset, dan metode Iterator ditulis ulang dalam koleksi set khusus ini. Inilah kuncinya. Metode iterator mengembalikan antarmuka iterator, dan di sini diimplementasikan ulang. Dengan memanggil metode entri dan kemudian memanggil metode Iteratornya. Berikut ini dianalisis dalam kombinasi dengan kode:
set publik <k> keyset () {set <k> ks = keyset; // set transien yang ditentukan <k> keyset if (ks == null) {// Panggilan pertama pasti null, buat contoh yang ditetapkan melalui kode ks = abstractset baru <k> () {// kustom set kustom iterator public retricoror <K> () {// tulis ulang metode iterator dari set kumpulan baru yang dikembalikan kumpulan kumpulan baru iterator <) {// Iterator <entri <k, v >> i = entryset (). Iterator (); // Buat set koleksi set iterator iterator boolean hasnext () {return i.hasnext (); // penilaian nilai kunci adalah penilaian entri} public k next () {return i.next (). GetKey (); // Nilai kunci berikutnya adalah mengambil entri#getKey} public void remeCE () {i.remove (); // hapus nilai kunci, hapus entri}}; } public int size () {// Metode set#set yang ditulis ulang mengembalikan abstractmap.this.size (); // Nilai kunci adalah seberapa besar seluruh peta, jadi sebut saja metode ukuran kelas ini. Ini adalah kelas internal. Gunakan kata kunci ini untuk mewakili kelas ini secara langsung. Ini harus menunjukkan bahwa metode ukuran dalam AbstractMap dipanggil. Tanpa ini, itu berarti bahwa itu adalah metode statis statis} public boolean isEmpty () {// set yang ditulis ulang#metode isempty mengembalikan abstractmap.this.isempty (); // Untuk apakah ada nilai kunci, itu berarti apakah peta itu kosong, jadi itu hanya untuk memanggil metode isempty dari kelas ini} public void clear () {// Set ditulis ulang#Metode Clear AbstractMap.this.clear (); // Hapus nilai kunci, itu hanya untuk menghapus peta, jadi itu hanya untuk memanggil metode yang jelas dari kelas ini} public boolean berisi (objek k) {// Menulis ulang set#berisi metode pengembalian abstrak abstrak.this.containskey (k); // menilai apakah set berisi data k, yang berarti apakah peta berisi nilai kunci, jadi sebut saja metode containsKey dari kelas ini}}; keyset = ks; // Tetapkan koleksi set khusus ini ke tombol variabel. Saat memanggil metode Keyset lagi di masa depan, karena Keyset tidak nol, Anda hanya perlu kembali secara langsung. } return ks;Saya pikir ini adalah implementasi yang sangat pintar. Meskipun metode ini berkisar pada nilai kunci, itu sebenarnya dapat diimplementasikan dalam kombinasi dengan entri tanpa melintasi entri. Pada saat yang sama, disebutkan di atas bahwa memanggil metode entryset# iterator, yang merupakan praktik terbaik mode metode templat. Karena entryset tidak diimplementasikan dalam AbstractMap, tetapi diserahkan kepada subkelasnya untuk diselesaikan, tetapi metode Keyset dapat diimplementasikan dengan "kerangka algoritma", yang merupakan pola metode templat.
koleksi publik <v> values ()
Untuk metode nilai, Anda dapat merujuk ke Keyset sepenuhnya. Keduanya memiliki efek yang sama, jadi saya tidak akan mengulanginya di sini untuk menghemat ruang.
Set Abstrak Publik <entri <K, v >> entryset ()
Metode abstrak diserahkan kepada subkelasnya untuk diselesaikan, menunjukkan bahwa metode ini tidak terlalu "umum".
Public Boolean Equals (Objek O)
Peta menetapkan bahwa hanya ketika kunci dan nilai dari setiap pasangan nilai kunci di peta sesuai satu per satu akan mengembalikan true. Dalam metode ini, pertama -tama menilai kondisi sederhana. Jika referensi sama, kembalikan true secara langsung. Jika parameter o bukan jenis peta, kembalikan False secara langsung. Jika jumlah dari dua peta berbeda, kembalikan False secara langsung. Hanya dengan begitu akan mengulangi array entri dan membandingkan apakah kunci dan nilai dalam entri sesuai satu per satu. Metode ini sederhana, tetapi ini memberi kita inspirasi. Dalam penilaian bersyarat, pertama -tama kita harus menilai yang dasar yang sederhana, dan kemudian menilai yang kompleks.
hashcode int publik ()
Tulis ulang metode yang sama dari kelas objek, dan tulis ulang kode hashcode juga diperlukan. Implementasi HashCode AbstractMap adalah untuk menambahkan nilai kode hashcode dari semua peta.Entry (di sini sederhana atau sederhana yang mudah dikenai) sampai akhir, dan jumlah akhir digunakan sebagai nilai kode hashcode peta.
string publik tostring ()
Tidak ada yang bisa dikatakan tentang metode ini, itu adalah untuk mengeluarkan semua pasangan nilai kunci dan menggunakan StringBuilder untuk menyambungkannya.
Clone objek yang dilindungi () melempar clonenotsupportedException
Menerapkan salinan dangkal, karena ini adalah salinan dangkal dari kunci dan nilai variabel, mencegah masalah yang disebabkan oleh dua salinan dangkal.