Koleksi Java adalah toolkit yang disediakan oleh Java, yang berisi struktur data yang umum digunakan: koleksi, daftar tertaut, antrian, tumpukan, array, peta, dll. Lokasi alat koleksi Java adalah java.util.*
Koleksi Java dapat dibagi menjadi 4 bagian: daftar daftar, set koleksi, peta peta, kelas alat (iterator iterator, kelas enumerasi enumerasi, array dan koleksi).
Kerangka kerja alat koleksi Java ditunjukkan di bawah ini.
Catatan: Melihat diagram kerangka kerja di atas, pertama -tama pahami batangnya, yaitu koleksi dan peta.
Koleksi adalah antarmuka, koleksi yang sangat abstrak, yang berisi operasi dan sifat dasar koleksi.
Koleksi termasuk dua cabang: Daftar dan set.
(01) Daftar adalah antrian yang dipesan, dan setiap elemen memiliki indeksnya. Nilai indeks elemen pertama adalah 0.
Kelas implementasi daftar termasuk LinkedList, ArrayList, Vector, Stack.
(02) Set adalah koleksi yang tidak memungkinkan elemen duplikat.
Kelas implementasi yang ditetapkan termasuk Hastset dan Treeset. Hashset bergantung pada hashmap, yang sebenarnya diimplementasikan melalui hashmap; Treeset bergantung pada TreeMap, yang sebenarnya diimplementasikan melalui TreeMap.
Peta adalah antarmuka pemetaan, yaitu pasangan nilai kunci nilai kunci. Setiap elemen dalam peta berisi "kunci" dan "nilai yang sesuai dengan kunci".
AbstractMap adalah kelas abstrak yang mengimplementasikan sebagian besar API di antarmuka peta. Hashmap, TreeMap, dan Weakhashmap semuanya diwarisi dari AbstractMap.
Meskipun hashtable mewarisi dari kamus, itu mengimplementasikan antarmuka peta.
Selanjutnya, mari kita lihat Iterator. Ini adalah alat untuk melintasi koleksi, yaitu, kami biasanya melintasi koleksi melalui Iterator Iterator. Kami mengatakan bahwa koleksi tergantung pada iterator karena kelas implementasi koleksi harus mengimplementasikan fungsi iterator () dan mengembalikan objek iterator.
ListIterator ada secara khusus untuk daftar traversing.
Mari kita lihat enumerasi lagi, ini adalah kelas abstrak yang diperkenalkan oleh JDK 1.0. Seperti Iterator, itu juga melintasi koleksi; Tetapi pencacahan memiliki lebih sedikit fungsi daripada Iterator. Dalam diagram blok di atas, enumerasi hanya dapat digunakan dalam hashtable, vector, stack.
Akhirnya, lihat array dan koleksi. Mereka adalah dua kelas alat yang mengoperasikan array dan koleksi.
Dengan kerangka kerja keseluruhan di atas, kami akan menganalisis setiap kelas secara terpisah.
Arsitektur Koleksi
Di bawah ini, kami akan meringkas koleksi. Mari kita lihat diagram hubungan beberapa kelas kerangka kerja dalam koleksi:
Koleksi adalah antarmuka, dan dua cabang utamanya adalah: daftar dan set.
Daftar dan set adalah antarmuka, dan mereka mewarisi dari koleksi. Daftar adalah antrian yang dipesan, dan bisa ada elemen berulang dalam daftar; Sementara Set adalah koleksi dalam konsep matematika, dan tidak ada elemen berulang dalam set!
Daftar dan set memiliki kelas implementasi sendiri.
Untuk implementasi yang mudah, kelas abstrak abstrak abstrak didefinisikan dalam koleksi, yang mengimplementasikan sebagian besar fungsi dalam koleksi; Dengan cara ini, di kelas implementasi koleksi, kita dapat menyimpan pengkodean rangkap dengan mewarisi AbstractCollection. AbstractList dan Abstractset keduanya mewarisi dari AbstractCollection, kelas implementasi daftar spesifik mewarisi dari AbstractList, dan kelas implementasi yang ditetapkan mewarisi dari Abstractset.
Selain itu, ada fungsi iterator () dalam koleksi, yang digunakan untuk mengembalikan antarmuka iterator. Biasanya, kami melintasi koleksi melalui Iterator Iterator. ListIterator unik untuk antarmuka daftar. Dalam antarmuka daftar, objek ListIterator dikembalikan melalui ListIterator ().
Selanjutnya, mari kita lihat pengenalan setiap antarmuka dan kelas abstrak; Kemudian, kami akan memiliki pemahaman terperinci tentang kelas implementasi.
1. Pengantar koleksi
Definisi koleksi adalah sebagai berikut:
Koleksi Antarmuka Publik <E> Memperluas Iterable <E> {} Ini adalah antarmuka, koleksi yang sangat abstrak, yang berisi operasi dasar koleksi: Menambahkan, Menghapus, Membersihkan, Melintasi (Membaca), apakah itu kosong, mendapatkan ukuran, apakah itu dilindungi oleh elemen tertentu, dll.
Semua subclass dari antarmuka koleksi (subkelas langsung dan subkelas tidak langsung) harus mengimplementasikan dua konstruktor: konstruktor tanpa parameter dan konstruktor dengan pengumpulan parameter. Konstruktor dengan parameter dapat digunakan untuk mengonversi jenis koleksi.
// Collection APIabstract boolean add(E object)abstract boolean addAll(Collection<? extends E> collection)abstract void clear()abstract boolean contains(Object object)abstract boolean containsAll(Collection<?> collection)abstract boolean equals(Object object)abstract int hashCode()abstract boolean isEmpty()abstract Iterator<E> iterator()abstract boolean remove(Object object)abstract boolean RemoveAll (Koleksi <?> Koleksi) Abstrak Boolean Retainall (Koleksi <?> Koleksi) Abstrak ukuran int () Abstrak <T> T [] ToArray (T [] Array) Abstrak Objek [] toArray ()
2. Pengantar daftar
Definisi daftar adalah sebagai berikut:
Daftar Antarmuka Publik <E> Memperluas Koleksi <E> {} Daftar adalah antarmuka yang diwarisi dari koleksi, yaitu, daftar adalah jenis koleksi. Daftar adalah antrian yang dipesan, dan setiap elemen dalam daftar memiliki indeks; Nilai indeks dari elemen pertama adalah 0, dan nilai indeks dari elemen berikutnya +1 pada gilirannya. Tidak seperti set, elemen duplikat diizinkan dalam daftar. Pendahuluan resmi daftar adalah sebagai berikut:
Daftar adalah koleksi yang mempertahankan pemesanan untuk elemen -elemennya. Setiap elemen dalam daftar memiliki indeks. Dengan demikian, setiap elemen dapat diakses oleh indeksnya, dengan indeks pertama menjadi nol. Biasanya, daftar memungkinkan elemen duplikat, dibandingkan dengan set, di mana elemen harus unik.
Tentang API. Karena daftar mewarisi dari antarmuka koleksi, secara alami berisi semua antarmuka fungsional dalam koleksi; Karena Daftar adalah antrian yang dipesan, ia juga memiliki antarmuka API sendiri. Yang utama termasuk "Tambah, Hapus, Dapatkan, dan Modifikasi Elemen di lokasi yang ditentukan", "Dapatkan subqueues dalam daftar", dll.
// Collection APIabstract boolean add(E object)abstract boolean addAll(Collection<? extends E> collection)abstract void clear()abstract boolean contains(Object object)abstract boolean containsAll(Collection<?> collection)abstract boolean equals(Object object)abstract int hashCode()abstract boolean isEmpty()abstract Iterator<E> iterator()abstract boolean remove(Object object)abstract boolean removeAll(Collection<?> collection)abstract boolean retainAll(Collection<?> collection)abstract int size()abstract <T> T[] toArray(T[] array)abstract Object[] toArray()// Compared with Collection, List's new API: abstract void add(int location, E object)abstract boolean addAll(int location, Collection<? extends E> collection)abstract E get(int location)abstract int indexOf(Object object)abstract int lastIndexof (objek objek) Abstrak ListIterator <E> ListIterator (Lokasi int) Abstrak ListIterator <E> ListIterator () Abstrak E Hapus (Lokasi Int) Abstrak E Set (Lokasi int, E Objek) Daftar Abstrak <e> Sublist (int start, int end)
3. Pengantar untuk Menetapkan
Set didefinisikan sebagai berikut:
Set Antarmuka Publik <E> Memperluas Koleksi <E> {} Set adalah antarmuka yang diwarisi dari koleksi, yaitu, set juga merupakan jenis koleksi. Set adalah koleksi tanpa elemen duplikat.
Tentang API. API Set persis sama dengan koleksi.
// Set's APIabstract boolean add(E object)abstract boolean addAll(Collection<? extends E> collection)abstract void clear()abstract boolean contains(Object object)abstract boolean containsAll(Collection<?> collection)abstract boolean equals(Object object)abstract int hashCode()abstract boolean isEmpty()abstract Iterator<E> iterator()abstract boolean remove(Object object)abstract boolean RemoveAll (Koleksi <?> Koleksi) Abstrak Boolean Retainall (Koleksi <?> Koleksi) Abstrak ukuran int () Abstrak <T> T [] ToArray (T [] Array) Abstrak Objek [] toArray ()
4. AbstractCollection
Definisi AbstractCollection adalah sebagai berikut:
Kelas Abstrak Publik AbstractCollection <E> mengimplementasikan koleksi <E> {} AbstractCollection adalah kelas abstrak yang mengimplementasikan fungsi dalam koleksi kecuali iterator () dan size ().
Fungsi utama AbstractCollection: Ini mengimplementasikan sebagian besar fungsi dalam antarmuka koleksi. Ini memfasilitasi kelas lain untuk mengimplementasikan koleksi, seperti ArrayList, LinkedList, dll. Jika kelas -kelas ini ingin mengimplementasikan antarmuka koleksi, sebagian besar antarmuka telah diimplementasikan dengan mewarisi AbstractCollection.
5. Daftar Abstrak
Definisi AbstractList adalah sebagai berikut:
Kelas Abstrak Publik AbstractList <E> Memperluas AbstractCollection <E> Menerapkan Daftar <E> {} AbstractList adalah kelas abstrak yang mewarisi dari AbstractCollection dan mengimplementasikan antarmuka daftar. Ini mengimplementasikan fungsi dalam daftar kecuali size () dan dapatkan (lokasi int).
Fungsi utama AbstractList: Ini mengimplementasikan sebagian besar fungsi dalam antarmuka daftar. Ini memfasilitasi kelas lain untuk mewarisi daftar.
Selain itu, dibandingkan dengan AbstractCollection, antarmuka Iterator () diimplementasikan dalam kelas abstrak AbstractList.
6. Abstractset
Definisi AbstractSet adalah sebagai berikut: Kelas Abstrak Publik Abstrak Abstrak <E> Memperluas AbstractCollection <E> Mengimplementasikan Set <E> {} Abstractset adalah kelas abstrak yang mewarisi dari AbstractCollection dan mengimplementasikan antarmuka yang ditetapkan. Karena antarmuka yang ditetapkan dan API di antarmuka koleksi persis sama, Set tidak memiliki API terpisah sendiri. Seperti AbstractCollection, ini mengimplementasikan fungsi dalam daftar kecuali iterator () dan size ().
Fungsi utama Abstractset: Ini mengimplementasikan sebagian besar fungsi di antarmuka yang ditetapkan. Ini memfasilitasi kelas lain untuk mengimplementasikan antarmuka yang ditetapkan.
7. Iterator
Definisi iterator adalah sebagai berikut:
Iterator Antarmuka Publik <E> {} Iterator adalah antarmuka, yang merupakan iterator koleksi. Koleksi dapat dilalui melalui elemen -elemen dalam koleksi melalui Iterator. Antarmuka API yang disediakan oleh Iterator meliputi: apakah elemen berikutnya ada, dapatkan elemen berikutnya, dan hapus elemen saat ini.
Catatan: Ketika Iterator melintasi koleksi, itu didasarkan pada mekanisme gagal-cepat. Artinya, ketika utas tertentu A melintasi set melalui iterator, jika konten set diubah oleh utas lain; Kemudian ketika utas A mengakses set, pengecualian ConcurrentModificationException akan dilemparkan, menghasilkan peristiwa gagal-cepat. Mengenai konten terperinci gagal-cepat, kami akan menjelaskannya secara khusus setelah ringkasan gagal-cepat.
// apiabstract boolean hasnext () abstrak next () abstrak rampai () Abstrak () Abstrak ()
8. Listiterator
Definisi listiterator adalah sebagai berikut:
ListIterator Antarmuka Publik <E> Memperluas Iterator <E> {} ListIterator adalah antarmuka yang diwarisi dari Iterator, yang merupakan iterator antrian. Digunakan khusus untuk daftar yang nyaman, dapat memberikan traversal maju/mundur. Dibandingkan dengan Iterator, ia menambahkan antarmuka API seperti menambahkan, apakah elemen sebelumnya ada, dan mendapatkan elemen sebelumnya.
// API ListIterator // Diwarisi dari Antarmuka Iterator Abstrak Boolean Hasnext () Abstrak E Next () Abstrak void Remove () // Tambahkan API Antarmuka Abstrak Void Add (E Objek) Abstrak Boolean Hasprevious () Abstrak NextIndex () Abstrak E Prior