Mulailah dengan Java Collections Framework

JDK 1.2 memperkenalkan kerangka kerja baru untuk koleksi objek, yang disebut Kerangka Koleksi Java. "Oh tidak," Anda mengerang, "bukan API lain, bukan kerangka kerja lain untuk dipelajari!" Tapi tunggu, sebelum Anda berpaling, dengarkan saya: Framework Koleksi sepadan dengan usaha Anda dan akan menguntungkan pemrograman Anda dalam banyak hal. Tiga manfaat besar segera muncul di benak:

  • Ini secara dramatis meningkatkan keterbacaan koleksi Anda dengan menyediakan seperangkat antarmuka standar untuk digunakan oleh banyak pemrogram di banyak aplikasi.
  • Itu membuat kode Anda lebih fleksibel dengan memungkinkan Anda meneruskan dan mengembalikan antarmuka daripada kelas konkret, menggeneralisasi kode Anda daripada menguncinya.
  • Ia menawarkan banyak implementasi khusus dari antarmuka, memungkinkan Anda untuk memilih koleksi yang paling pas dan menawarkan kinerja tertinggi untuk kebutuhan Anda.

Dan itu baru permulaan.

Tur kerangka kami akan dimulai dengan gambaran umum tentang keuntungan yang diberikannya untuk menyimpan set objek. Seperti yang akan segera Anda temukan, karena teman pekerja keras lama Anda Hashtabledan Vectormendukung API baru, program Anda akan seragam dan ringkas - sesuatu yang Anda dan pengembang yang mengakses kode Anda pasti akan dukung.

Setelah diskusi awal kita, kita akan menggali lebih dalam detailnya.

Keunggulan Java Collections: Gambaran umum

Sebelum Koleksi membuat debutnya yang paling disambut, metode standar untuk mengelompokkan objek Java adalah melalui array, the Vector, dan the Hashtable. Ketiga koleksi ini memiliki metode dan sintaks yang berbeda untuk mengakses anggota: array menggunakan simbol kurung siku ([]), Vectormenggunakan elementAtmetode, dan Hashtablepenggunaan getserta putmetode. Perbedaan-perbedaan ini telah lama mengarahkan programmer ke jalan yang tidak konsisten dalam mengimplementasikan koleksi mereka sendiri - beberapa meniru Vectormetode akses dan beberapa meniru Enumerationantarmuka.

Untuk lebih memperumit masalah, sebagian besar Vectormetode ditandai sebagai final; artinya, Anda tidak dapat memperluas Vectorkelas untuk mengimplementasikan koleksi yang serupa. Kita bisa membuat kelas koleksi yang tampak seperti a Vectordan bertindak seperti a Vector, tetapi tidak bisa diteruskan ke metode yang menggunakan Vectorparameter.

Akhirnya, tidak ada koleksi (larik, Vectoratau Hashtable) yang mengimplementasikan antarmuka akses anggota standar. Saat pemrogram mengembangkan algoritme (sejenisnya) untuk memanipulasi koleksi, wacana panas meletus tentang objek apa yang akan diteruskan ke algoritme. Haruskah Anda melewatkan array atau a Vector? Haruskah Anda menerapkan kedua antarmuka? Bicara tentang duplikasi dan kebingungan.

Untungnya, Java Collections Framework memperbaiki masalah ini dan menawarkan sejumlah keuntungan dibandingkan tidak menggunakan framework atau menggunakan Vectordan Hashtable:

  • Satu set antarmuka koleksi yang dapat digunakan

    Dengan menerapkan salah satu antarmuka dasar - Collection, Set, List, atau Map- Anda memastikan sesuai kelas Anda ke API umum dan menjadi lebih teratur dan mudah dipahami. Jadi, apakah Anda mengimplementasikan database SQL, color swatch matcher, atau aplikasi chat jarak jauh, jika Anda mengimplementasikan Collectionantarmuka, operasi pada kumpulan objek Anda akan diketahui oleh pengguna Anda. Antarmuka standar juga menyederhanakan penerusan dan pengembalian koleksi ke dan dari metode kelas dan memungkinkan metode untuk bekerja pada lebih banyak variasi koleksi.

  • Satu set dasar implementasi kumpulan

    Selain trusty Hashtabledan Vector, yang telah diperbarui untuk mengimplementasikan Collectionantarmuka, implementasi koleksi baru telah ditambahkan, termasuk HashSetdan TreeSet, ArrayListdan LinkedList, HashMapdan Map. Menggunakan penerapan umum yang sudah ada membuat kode Anda lebih pendek dan lebih cepat untuk diunduh. Selain itu, menggunakan inti kode Java Inti memastikan bahwa setiap peningkatan pada kode dasar juga akan meningkatkan kinerja kode Anda.

  • Peningkatan berguna lainnya

    Setiap koleksi sekarang mengembalikan Iterator, jenis yang ditingkatkan Enumerationyang memungkinkan operasi elemen seperti penyisipan dan penghapusan. The Iteratoradalah "gagal-cepat," yang berarti Anda mendapatkan perkecualian jika daftar Anda iterasi diubah oleh user lain. Juga, koleksi berbasis daftar seperti Vectormengembalikan a ListIteratoryang memungkinkan iterasi dan pembaruan dua arah.

    Beberapa koleksi ( TreeSetdan TreeMap) secara implisit mendukung pengurutan. Gunakan kelas-kelas ini untuk mempertahankan daftar yang diurutkan dengan mudah. Anda dapat menemukan elemen terkecil dan terbesar atau melakukan pencarian biner untuk meningkatkan kinerja daftar besar. Anda bisa mengurutkan koleksi lain dengan menyediakan metode perbandingan-koleksi ( Comparatorobjek) atau metode perbandingan objek ( Comparableantarmuka).

    Terakhir, kelas statis Collectionsmenyediakan versi koleksi yang ada yang tidak dapat dimodifikasi (hanya-baca) dan tersinkronisasi. Kelas yang tidak dapat dimodifikasi sangat membantu untuk mencegah perubahan yang tidak diinginkan pada koleksi. Versi koleksi yang tersinkronisasi adalah kebutuhan untuk program multithread.

Kerangka Kerja Koleksi Java adalah bagian dari Core Java dan terdapat dalam java.util.collectionspaket JDK 1.2. Kerangka kerja ini juga tersedia sebagai paket untuk JDK 1.1 (lihat Sumberdaya).

Catatan: Koleksi versi JDK 1.1 diberi nama com.sun.java.util.collections. Perlu diingat bahwa kode yang dikembangkan dengan versi 1.1 harus diperbarui dan dikompilasi ulang untuk versi 1.2, dan semua objek yang diserialkan di 1.1 tidak dapat dideserialisasi menjadi 1.2.

Mari kita lihat lebih dekat keuntungan ini dengan menggunakan Java Collections Framework dengan beberapa kode kita sendiri.

API yang bagus

Keuntungan pertama dari Java Collections Framework adalah API yang konsisten dan teratur. API yang dikodifikasikan dalam satu set dasar interface, Collection, Set, List, atau Map. The Collectionantarmuka berisi operasi pengumpulan dasar seperti menambah, menghapus, dan tes untuk keanggotaan (containment). Implementasi apa pun dari koleksi, baik yang disediakan oleh Java Collections Framework atau salah satu kreasi Anda sendiri, akan mendukung salah satu antarmuka ini. Karena framework Collections teratur dan konsisten, Anda akan mempelajari sebagian besar framework hanya dengan mempelajari antarmuka ini.

Keduanya Setdan Listmenerapkan Collectionantarmuka. The Setantarmuka identik dengan Collectionantarmuka kecuali metode tambahan, toArrayyang mengkonversi Setke Objectarray yang. The Listantarmuka juga menerapkan Collectionantarmuka, tetapi menyediakan banyak accesor yang menggunakan indeks integer ke dalam daftar. Misalnya, get, remove, dan setsemua mengambil integer yang mempengaruhi elemen diindeks dalam daftar. The Mapantarmuka tidak berasal dari koleksi, tetapi memberikan tampilan yang mirip dengan metode dalam java.util.Hashtable. Kunci digunakan untuk meletakkan dan mendapatkan nilai. Masing-masing antarmuka ini dijelaskan dalam contoh kode berikut.

Segmen kode berikut menunjukkan cara melakukan banyak Collectionoperasi pada HashSet, kumpulan dasar yang mengimplementasikan Setantarmuka. A HashSethanyalah sebuah himpunan yang tidak mengizinkan elemen duplikat dan tidak mengatur atau memposisikan elemennya. Kode tersebut menunjukkan bagaimana Anda membuat koleksi dasar dan menambahkan, menghapus, dan menguji elemen. Karena Vectorsekarang mendukung Collectionantarmuka, Anda juga dapat mengeksekusi kode ini pada vektor, yang dapat Anda uji dengan mengubah HashSetdeklarasi dan konstruktor menjadi Vector.

import java.util.collections. *; public class CollectionTest {// Statika public static void main (String [] args) {System.out.println ("Collection Test"); // Buat koleksi HashSet collection = new HashSet (); // Menambahkan String dog1 = "Max", dog2 = "Bailey", dog3 = "Harriet"; collection.add (dog1); collection.add (dog2); collection.add (dog3); // Sizing System.out.println ("Koleksi dibuat" + ", size =" + collection.size () + ", isEmpty =" + collection.isEmpty ()); // Containment System.out.println ("Koleksi berisi" + dog3 + ":" + collection.contains (dog3)); // Pengulangan. Iterator mendukung hasNext, selanjutnya, hapus System.out.println ("Collection iteration (unsorted):"); Iterator iterator = collection.iterator (); sementara (iterator.hasNext ()) System.out.println ("" + iterator.next ()); // Menghapus collection.remove (dog1); collection.clear (); }}

Sekarang mari kita membangun pengetahuan dasar tentang koleksi dan melihat antarmuka dan implementasi lain di Java Collections Framework.

Implementasi konkret yang baik

Kami telah melatih Collectionantarmuka pada koleksi beton, file HashSet. Sekarang mari kita lihat set lengkap implementasi kumpulan beton yang disediakan dalam kerangka kerja Koleksi Java. (Lihat bagian Resources untuk link ke outline beranotasi Sun tentang framework Koleksi Java.)

Implementasi
Tabel Hash Array Resizable Pohon Seimbang (Diurutkan) Daftar Tertaut Warisan
Antarmuka Set HashSet * TreeSet * *
Daftar * ArrayList * LinkedList Vektor
Peta HashMap * TreeMap * Hashtable

Implementations marked with an asterix (*) make no sense or provide no compelling reason to implement. For instance, providing a List interface to a Hash Table makes no sense because there is no notion of order in a Hash Table. Similarly, there is no Map interface for a Linked List because a list has no notion of table lookup.

Let's now exercise the List interface by operating on concrete implementations that implement the List interface, the ArrayList, and the LinkedList. The code below is similar to the previous example, but it performs many List operations.

import java.util.collections.*; public class ListTest { // Statics public static void main( String [] args ) { System.out.println( "List Test" ); // Create a collection ArrayList list = new ArrayList(); // Adding String [] toys = { "Shoe", "Ball", "Frisbee" }; list.addAll( Arrays.toList( toys ) ); // Sizing System.out.println( "List created" + ", size=" + list.size() + ", isEmpty=" + list.isEmpty() ); // Iteration using indexes. System.out.println( "List iteration (unsorted):" ); for ( int i = 0; i < list.size(); i++ ) System.out.println( " " + list.get( i ) ); // Reverse Iteration using ListIterator System.out.println( "List iteration (reverse):" ); ListIterator iterator = list.listIterator( list.size() ); while ( iterator.hasPrevious() ) System.out.println( " " + iterator.previous() ); // Removing list.remove( 0 ); list.clear(); } } 

As with the first example, it's simple to swap out one implementation for another. You can use a LinkedList instead of an ArrayList simply by changing the line with the ArrayList constructor. Similarly, you can use a Vector, which now supports the List interface.

When deciding between these two implementations, you should consider whether the list is volatile (grows and shrinks often) and whether access is random or ordered. My own tests have shown that the ArrayList generally outperforms the LinkedList and the new Vector.

Notice how we add elements to the list: we use the addAll method and the static method Arrays.toList. This static method is one of the most useful utility methods in the Collections framework because it allows any array to be viewed as a List. Now an array may be used anywhere a Collection is needed.

Notice that I iterate through the list via an indexed accessor, get, and the ListIterator class. In addition to reverse iteration, the ListIterator class allows you to add, remove, and set any element in the list at the point addressed by the ListIterator. This approach is quite useful for filtering or updating a list on an element-by-element basis.

Antarmuka dasar terakhir dalam Java Collections Framework adalah Map. Antarmuka ini diimplementasikan dengan dua implementasi konkret baru, the TreeMapdan HashMap. Ini TreeMapadalah implementasi pohon seimbang yang mengurutkan elemen berdasarkan kunci.

Mari kita ilustrasikan penggunaan Mapantarmuka dengan contoh sederhana yang menunjukkan cara menambahkan, membuat kueri, dan menghapus koleksi. Contoh ini, yang menggunakan HashMapkelas, tidak jauh berbeda dari bagaimana kita menggunakan Hashtablesebelum debut kerangka Koleksi. Sekarang, dengan pembaruan Hashtableuntuk mendukung Mapantarmuka, Anda dapat menukar baris yang membuat instance HashMapdan menggantinya dengan instance Hashtable.