Koleksi di Java sebagian besar terkonsentrasi di dua bagian, satu di paket java.util, dan yang lainnya di java.util.concurrent. Yang terakhir didasarkan pada yang pertama dan mendefinisikan beberapa koleksi yang mengimplementasikan fungsi sinkronisasi.
Artikel ini terutama berfokus pada berbagai objek koleksi di java.util. Objek koleksi di Java secara kasar dapat dibagi menjadi tiga kategori: Daftar, Kumpulan, dan Peta. Diagram UML yang sesuai adalah sebagai berikut (termasuk sebagian besar objek koleksi di java.util):
Ikhtisar koleksi
Koleksi Daftar dan Kumpulan di Java berasal dari Koleksi. Ini adalah titik masuk yang baik untuk mempelajari koleksi. Ini mencakup operasi yang biasanya diperlukan dalam koleksi:
Tambahkan elemen: tambahkan/tambahkanSemua
Hapus koleksi: hapus
Hapus elemen: hapus/hapusSemua
Tentukan apakah koleksi berisi elemen: berisi/berisiSemua
Tentukan apakah koleksinya kosong: isEmpty
Hitung jumlah elemen dalam koleksi: ukuran
Ubah koleksi menjadi array: toArray
Dapatkan iterator: iterator
Mari kita lihat contoh sederhana. Kode berikut akan mengembalikan koleksi yang elemennya dihasilkan secara acak:
pengumpulan kembali;
}
1) Gunakan iterator untuk melintasi koleksi. Seperti disebutkan saat menjelaskan antarmuka Koleksi di atas, semua koleksi akan memiliki iterator yang dapat kita gunakan untuk menelusuri koleksi.
Daftar di Java adalah perpanjangan efektif dari array. Ini adalah struktur yang dapat menampung elemen jenis apa pun jika obat generik tidak digunakan, ia hanya dapat menampung elemen dari tipe yang ditentukan oleh obat generik. Dibandingkan dengan array, kapasitas Daftar dapat diperluas secara dinamis.
Elemen-elemen dalam Daftar dapat diulang, dan elemen-elemen di dalamnya "diurutkan". Yang "diurutkan" di sini bukan berarti mengurutkan, tetapi berarti kita dapat menentukan posisi suatu elemen dalam koleksi.
Objek koleksi yang umum digunakan dalam Daftar meliputi: ArrayList, Vector dan LinkedList, dua yang pertama disimpan berdasarkan array, dan yang terakhir disimpan berdasarkan daftar tertaut. Diantaranya, Vector aman untuk thread, dan dua lainnya tidak aman untuk thread.
Daftar dapat berisi null, meskipun obat generik digunakan.
ArrayList mungkin merupakan objek koleksi yang paling umum digunakan. Dalam kode contoh di atas, kami juga menggunakannya untuk membuat instance objek Koleksi, jadi kami tidak akan membahas detailnya di sini.
Vektor
Contoh Vector adalah sebagai berikut. Pertama kita lihat cara menghasilkan dan mengeluarkan Vector:
[9, 29, 32, 54, 12]
ukuran vektor adalah 3
[29, 32, 54]
LinkedList menggunakan daftar tertaut untuk menyimpan data. Kode contohnya adalah sebagai berikut:
Outputnya adalah sebagai berikut:
batal
batal
batal
ukuran daftar tertaut adalah 8
[100, 84, 19, 57, 68, 26, 27, 47]
Set mirip dengan Daftar, keduanya digunakan untuk menyimpan satu elemen, dan jumlah elemen individual tidak pasti. Namun Set tidak boleh berisi elemen duplikat. Jika dua elemen identik disisipkan ke dalam Set, elemen terakhir tidak akan disisipkan.
Set secara kasar dapat dibagi menjadi dua kategori: Set yang tidak disortir dan Set yang diurutkan. Set yang tidak disortir mencakup HashSet dan LinkedHashSet, dan Set yang diurutkan terutama mengacu pada TreeSet. Diantaranya, HashSet dan LinkedHashSet dapat berisi null.
Set Hash
HashSet adalah koleksi yang didukung oleh tabel Hash, yang tidak aman untuk thread.
Mari kita lihat contoh berikut, yang pada dasarnya sama dengan contoh pertama dengan Vector:
untuk (int saya = 0; saya < 3; saya++)
{
set.tambahkan(Bilangan Bulat baru(100));
}
set.tambahkan(null);
System.out.println("ukuran himpunan adalah " + set.ukuran());
Sistem.keluar.println(set);
}
classMyInteger
{
nilai Integer pribadi;
publik MyInteger (Nilai bilangan bulat)
{
this.nilai = nilai;
}
String publik keString()
{
return String.valueOf(nilai);
}
Kode hash int publik()
{
kembali 1;
}
boolean publik sama dengan(Obj objek)
{
kembali benar;
}
}
Berikut ini adalah metode pengujian yang sesuai:
untuk (int saya = 0; saya < 3; saya++)
{
set.tambahkan(Baru Bilangan Bulat Saya(100));
}
System.out.println("ukuran himpunan adalah " + set.ukuran());
Sistem.keluar.println(set);
}
TreeSet adalah Set yang mendukung pengurutan, dan antarmuka induknya adalah SortedSet.
Pertama mari kita lihat operasi dasar TreeSet:
Acak r = baru Acak();
untuk (int saya = 0; saya < 5; saya++)
{
set.tambahkan(Integer baru(r.nextInt(100)));
}
Sistem.keluar.println(set);
Sistem.keluar.println(set.pertama());
Sistem.keluar.println(set.last());
Sistem.keluar.println(set.descendingSet());
System.out.println(set.headSet(Integer baru(50)));
System.out.println(set.tailSet(Integer baru(50)));
Sistem.keluar.println(set.subSet(30, 60));
System.out.println(set.floor(50));
System.out.println(set.ceiling(50));
}
[53, 49, 48, 42, 8]
[8, 42, 48, 49]
[53]
[42, 48, 49, 53]
Selanjutnya kita definisikan ulang Integer terlebih dahulu:
publik MyInteger2 (nilai int)
{
this.nilai = nilai;
}
public int bandingkanTo(Objek arg0)
{
Suhu Bilangan Bulat Saya2 = (Bilangan Bulat Saya2)arg0;
jika (temp == null) kembalikan -1;
if (nilai sementara > nilai ini)
{
kembali 1;
}
else if (nilai sementara < nilai ini)
{
kembali -1;
}
kembali 0;
}
boolean publik sama dengan(Obj objek)
{
kembalikan bandingkanTo(obj) == 0;
}
String publik keString()
{
return String.valueOf(nilai);
}
}
Peta menyimpan "pasangan nilai kunci". Mirip dengan Set, ada dua jenis Peta di Java: diurutkan dan tidak disortir termasuk HashMap, Hashtable dan LinkedHashMap, dan diurutkan termasuk TreeMap.
Peta Tidak Disortir
Baik HashMap maupun Hashtable disimpan dalam bentuk tabel Hash. HashMap tidak aman untuk thread, namun Hashtable aman untuk thread. Kita dapat menganggap HashMap sebagai versi Hashtable yang "disederhanakan".
HashMap dapat menyimpan null, baik untuk Kunci atau Nilai. Hashtable tidak dapat menyimpan null.
Terlepas dari HashMap atau Hashtable, jika kita mengamati konstruktornya, kita akan menemukan bahwa konstruktornya dapat memiliki dua parameter: InitialCapacity dan LoadFactor. Secara default, InitialCapacity sama dengan 16 dan LoadFactor sama dengan 0,75. Hal ini terkait dengan jumlah elemen yang dapat disimpan dalam tabel Hash. Ketika jumlah elemen melebihi kapasitas awal*loadFactor, metode pengulangan akan dipicu untuk memperluas tabel hash. Jika kita perlu memasukkan terlalu banyak elemen ke dalamnya, kita perlu menyesuaikan kedua parameter ini dengan tepat.
Pertama mari kita lihat contoh HashMap:
peta.put(Integer baru(1), "a");
map.put(Integer baru(2), "b");
peta.put(Integer baru(3), "c");
System.out.println(peta);
Sistem.keluar.println(peta.entrySet());
Sistem.keluar.println(peta.keySet());
Sistem.keluar.println(peta.nilai());
}
peta.put(null, null);
peta.put(null, null);
map.put(Integer baru(4), null);
map.put(Integer baru(5), null);
System.out.println(peta);
Sistem.keluar.println(peta.entrySet());
Sistem.keluar.println(peta.keySet());
Sistem.keluar.println(peta.nilai());
}
tabel.put(Integer baru(1), "a");
tabel.put(Integer baru(2), "b");
tabel.put(Integer baru(3), "c");
System.out.println(tabel);
Sistem.keluar.println(tabel.entrySet());
Sistem.keluar.println(tabel.keySet());
System.out.println(tabel.nilai());
}
pribadi statis kekosongan hashTableTest2()
{
Peta<Bilangan Bulat,String> tabel = Hashtable baru<Bilangan Bulat, String>();
tabel.put(null, null);
tabel.put(null, null);
tabel.put(Integer baru(4), null);
tabel.put(Integer baru(5), null);
System.out.println(tabel);
Sistem.keluar.println(tabel.entrySet());
Sistem.keluar.println(tabel.keySet());
System.out.println(tabel.nilai());
}
Penyortiran Peta terutama mengacu pada TreeMap, yang memiliki kompleksitas waktu O(log(n)) saat menambahkan, menghapus, dan mencari elemen. Ini tidak aman untuk thread.
Karakteristiknya sangat mirip dengan TreeSet, jadi saya tidak akan membahas detailnya di sini.