Antarmuka yang ditetapkan di Java memiliki karakteristik berikut:
Elemen berulang tidak diizinkan;
Elemen -elemen dalam set tidak ada urutan;
Ada dan hanya satu elemen dengan nilai nol.
Karena antarmuka yang ditetapkan dalam Java meniru abstraksi set matematika, karakteristik himpunan matematika yang sesuai adalah:
Reksa lawan jenis: Dalam satu set, dua elemen dianggap berbeda, yaitu, masing -masing elemen hanya dapat muncul sekali.
Gangguan: Dalam satu set, setiap elemen memiliki status yang sama dan tidak teratur di antara elemen. Hubungan berurutan dapat didefinisikan pada set. Setelah mendefinisikan hubungan urutan, elemen dapat diurutkan sesuai dengan hubungan urutan. Tetapi dalam hal karakteristik set itu sendiri, tidak ada urutan yang diperlukan antara elemen.
Sifat set kosong: set kosong adalah subset dari semua set
Set tidak menyimpan elemen duplikat. Set yang paling umum digunakan adalah atribut uji, Anda dapat dengan mudah bertanya apakah suatu objek dalam satu set. Set memiliki antarmuka yang persis sama dengan koleksi, jadi tidak ada fungsi tambahan. Faktanya, Set adalah koleksi, tetapi perilakunya berbeda.
Hal -hal utama yang mengimplementasikan antarmuka yang ditetapkan adalah Hashset, Treeset, dan LinkedHashset, yang merupakan titik umum dari setiap item yang sama disimpan hanya satu salinan. Mereka juga memiliki perbedaan, perbedaannya adalah sebagai berikut:
1. Hashset:
Hashset menggunakan cara yang sangat kompleks untuk menyimpan elemen. Menggunakan hashset bisa mendapatkan elemen dalam koleksi secepat mungkin, yang sangat efisien (untuk ruang untuk waktu perdagangan). Apakah Pangduan adalah objek yang sama akan ditentukan berdasarkan kode hash dan sama. Jika kode hash adalah sama dan sama dengan pengembalian true, itu adalah objek yang sama dan tidak dapat disimpan berulang kali.
paket cn.set; import java.util.hashset; import java.util.set; class student {int id; siswa publik (int id) {this.id = id; } @Override public string toString () {return this.id+""; } @Override public int hashCode () {return this.id; } @Override Public Boolean Equals (objek obj) {if (instance Obj dari siswa) {student stu = (siswa) obj; if (stu.id == this.id) return true; } return false; }} kelas publik hashsetTest {public static void main (string [] args) {set <schuid> set = new HashSet <Shikent> (); Siswa S1 = Siswa Baru (1); Siswa S2 = Siswa Baru (1); Siswa S3 = Siswa Baru (2); set.add (s1); set.add (s2); set.add (s3); untuk (Siswa S: Set) {System.out.println (s); }}}Seperti yang ditunjukkan pada contoh di atas, setelah menulis ulang metode hashcode () dan setara () untuk membedakan objek persetujuan, objek yang sama tidak dapat disimpan. Jika kedua metode ini dianotasi, semua objek siswa dianggap sebagai objek yang berbeda dan dapat disimpan.
2.Treeset
Treeeset tidak dapat menyimpan objek duplikat, tetapi Treeset akan secara otomatis mengurutkan. Jika objek yang disimpan tidak dapat diurutkan, kesalahan akan dilaporkan, sehingga objek yang disimpan harus menentukan aturan penyortiran. Aturan penyortiran termasuk penyortiran alami dan penyortiran pelanggan.
① Penyortiran Alami: Objek untuk menambahkan TreeSet akan mengimplementasikan antarmuka Java.lang. Mengembalikan 0 berarti bahwa itu adalah objek yang sama, jika tidak itu adalah objek yang berbeda.
②Scustomer Sorting: Buat kelas pihak ketiga dan terapkan antarmuka java.util.compparator. Dan menulis ulang metode ini. Tentukan koleksi Form Treeset TS = TreeSet baru (kelas ketiga baru ());
Contoh berikut menggunakan Treeset untuk menyimpan objek yang diurutkan secara alami:
paket cn.set; import java.util.set; import java.util.treeset; kelas Student1 mengimplementasikan sebanding <Sahen1> {int id; public student1 (int id) {this.id = id; } @Override public string toString () {return this.id+""; } @Override public int hashCode () {return this.id; } @Override Public Boolean Equals (Object Obj) {if (instance Obj dari Student1) {student1 stu = (student1) obj; if (stu.id == this.id) return true; } return false; } public int compareto (student1 o) {return (this.id-o.id); }} kelas publik TreeesStest {public static void main (string [] args) {set <schenent1> set = new TreeSet <schenent1> (); Student1 S1 = Student1 baru (5); Student1 S2 = Student1 baru (1); Student1 S3 = Student1 baru (2); Student1 S4 = Student1 baru (4); Student1 S5 = Student1 baru (3); set.add (s1); set.add (s2); set.add (s3); set.add (s4); set.add (s5); untuk (student1 s: set) {System.out.println (s); }}} Hasil outputnya adalah:
Contoh berikut menggunakan TreeSet untuk menyimpan objek yang diurutkan pelanggan:
Paket com.set; import java.util.set; import java.util.treeset; kelas Student1 mengimplementasikan sebanding dengan <Sahen1> {int id; public student1 (int id) {this.id = id; } @Override public string toString () {return this.id+""; } @Override public int hashCode () {return this.id; } @Override Public Boolean Equals (Object Obj) {if (instance Obj dari Student1) {student1 stu = (student1) obj; if (stu.id == this.id) return true; } return false; } public int compareto (student1 o) {return (this.id-o.id); }} kelas publik TreeesStest {public static void main (string [] args) {set <schenent1> set = new TreeSet <schenent1> (); Student1 S1 = Student1 baru (5); Student1 S2 = Student1 baru (1); Student1 S3 = Student1 baru (2); Student1 S4 = Student1 baru (4); Student1 S5 = Student1 baru (3); set.add (s1); set.add (s2); set.add (s3); set.add (s4); set.add (s5); untuk (student1 s: set) {System.out.println (s); }}} Hasil outputnya adalah:
Semua orang tahu bahwa daftar diurutkan sesuai urutan penyisipan saat disimpan. Faktanya, Anda juga dapat mengurutkan koleksi daftar berdasarkan penyortiran alami dan penyortiran pelanggan. Silakan lihat:
paket cn.set; import java.util.arraylist; import java.util.collections; import java.util.list; kelas mysort1 mengimplementasikan java.util.comparator <Sahent3> {public int compare (student3 o1, student3 o2) {return o2.id-o1.id; }} class Student3 mengimplementasikan yang sebanding <Sahen3> {int id; public student3 (int id) {this.id = id; } @Override public string toString () {return this.id+""; } public int compareto (student3 o) {return (this.id-o.id); }} Public Class ListSort {public static void main (string [] args) {list <schenent3> list = new ArrayList <schenent3> (); Student3 S1 = Student3 baru (5); Student3 S2 = Student3 baru (1); Student3 S3 = Student3 baru (2); Student3 S4 = Student3 baru (4); Student3 S5 = Student3 baru (3); list.add (s1); list.add (s2); list.add (s3); list.add (s4); list.add (s5); System.out.println (daftar); // penyortiran alami: collections.sort (daftar); System.out.println (daftar); // customer sortir collections.sort (daftar, mysort1 baru ()); System.out.println (daftar); }} Hasil outputnya adalah:
[5, 1, 2, 4, 3]
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]
Berikut ini adalah prinsip bahwa antarmuka koleksi set di Java tidak mengimplementasikan duplikasi penyisipan objek:
Dalam koleksi Java, aturan untuk menentukan apakah dua objek sama adalah:
1) Tentukan apakah kode hash dari kedua objek itu sama
Jika tidak sama, dianggap bahwa kedua objek tidak sama. Jika sama, beralih ke 2)
(Ini hanya diperlukan untuk meningkatkan efisiensi penyimpanan. Faktanya, dimungkinkan untuk tidak memiliki secara teoritis, tetapi jika tidak, efisiensinya akan sangat berkurang selama penggunaan aktual, jadi kami akan membuatnya perlu di sini. Masalah ini akan difokuskan pada nanti.)
2) Tentukan apakah kedua objek tersebut sama -sama dihitung menggunakan setara
Jika tidak sama, pikirkan bahwa kedua objek itu tidak sama. Jika sama, pikirkan bahwa kedua objek itu sama (sama () adalah kunci untuk menilai apakah kedua objek itu sama)
Untuk objek kelas umum (kecuali objek yang dienkapsulasi seperti string):
Jika kelas biasa tidak mengganti metode hashcode () dan setara (), maka ketika membandingkan objek, metode hashcode () di kelas objek yang diwariskan, metode hashcode () dalam kelas objek adalah metode lokal. Saat membandingkan nilai pengembalian metode, alamat objek (alamat referensi) dibandingkan. Gunakan metode baru untuk membuat objek dengan konten yang sama. Tentu saja, objek yang berbeda dihasilkan dua kali. Kecuali metode hashcode () ditimpa. Metode Equals () yang didefinisikan dalam kelas objek juga merupakan perbandingan alamat objek. Singkatnya: Jika Anda tidak menulis ulang metode hashcode () dan setara () dari kelas biasa, alamat referensi objek berbeda dalam koleksi set, dan objek tidak akan diulang.
Untuk objek seperti String (String, Integer, Double ... dll.):
Karena kelas enkapsulasi ini sendiri telah menulis ulang metode hashcode (), dan nilai pengembalian metode penulisan ulang terkait dengan konten objek, bukan ke alamat referensi. Metode Equals () dalam kelas yang dienkapsulasi ini juga ditulis ulang, membandingkan konten objek daripada alamat referensi. Singkatnya, objek kelas seperti String membandingkan kontennya dalam koleksi, dan jika konten yang sama ditimpa, objek yang ada tercakup.
Di atas adalah semua tentang artikel ini, saya harap ini akan membantu untuk pembelajaran semua orang.