الواجهة المحددة في Java لها الخصائص التالية:
العناصر المتكررة غير مسموح بها ؛
العناصر في المجموعة لا ترتيب ؛
هناك وعنصر واحد فقط مع قيمة فارغة.
نظرًا لأن واجهة SET في Java تحاكي تجريد المجموعة الرياضية ، فإن خصائص المجموعة الرياضية المقابلة هي:
الجنس المتبادل: في مجموعة ، يعتبر أي عنصران مختلفان ، أي أن كل عنصر يمكن أن يظهر مرة واحدة فقط.
الاضطراب: في مجموعة ، كل عنصر له نفس الحالة ويتأثر بين العناصر. يمكن تعريف العلاقات المتسلسلة على مجموعة. بعد تحديد علاقات الطلب ، يمكن فرز العناصر وفقًا لعلاقة الطلب. ولكن فيما يتعلق بخصائص المجموعة نفسها ، لا يوجد ترتيب ضروري بين العناصر.
طبيعة مجموعة فارغة: مجموعة فارغة هي مجموعة فرعية من جميع المجموعات
SET لا يحفظ عناصر مكررة. المجموعة الأكثر استخدامًا هي سمات الاختبار ، يمكنك بسهولة أن تسأل عما إذا كان الكائن في مجموعة. يحتوي SET على نفس الواجهة تمامًا مثل المجموعة ، لذلك لا توجد وظائف إضافية. في الواقع ، SET عبارة عن مجموعة ، لكن السلوك مختلف.
الأشياء الرئيسية التي تنفذ الواجهة المحددة هي Hashset و Treeset و LinkedHashSet ، والتي تم حفظها النقاط المشتركة لكل عنصر نفس نسخة واحدة فقط. لديهم أيضًا اختلافات ، والاختلافات هي كما يلي:
1. Hashset:
يستخدم Hashset طريقة معقدة للغاية لتخزين العناصر. يمكن أن يؤدي استخدام HASHSET إلى الحصول على عناصر في المجموعة بأسرع وقت ممكن ، وهو فعال للغاية (للمساحة للوقت التجاري). ما إذا كان Pangduan هو نفس الكائن سيتم تحديده بناءً على Hashcode و Equals. إذا كان رمز hashcode هو نفسه ويساوي الإرجاع صحيحًا ، فهو نفس الكائن ولا يمكن تخزينه بشكل متكرر.
حزمة cn.set ؛ استيراد java.util.hashset ؛ استيراد java.util.set ؛ فئة الطالب {int id ؛ الطالب العام (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 (obj extureof student) {student stu = (student) obj ؛ if (stu.id == this.id) return true ؛ } إرجاع خطأ ؛ }} الفئة العامة HashSettest {public static void main (string [] args) {set <Tudent> set = new hashset <Tudent> () ؛ الطالب S1 = طالب جديد (1) ؛ الطالب S2 = طالب جديد (1) ؛ الطالب S3 = طالب جديد (2) ؛ set.add (s1) ؛ set.add (S2) ؛ set.add (S3) ؛ لـ (الطالب s: set) {system.out.println (s) ؛ }}}كما هو موضح في المثال أعلاه ، بعد إعادة كتابة طرق Hashcode () و equals () لتمييز كائنات الموافقة ، لا يمكن تخزين نفس الكائنات. إذا تم شرح هاتين الطريقتين ، فإن جميع كائنات الطلاب تعتبر كائنات مختلفة ويمكن تخزينها.
2. Treeset
لا يمكن لـ Treeset تخزين الكائنات المكررة ، لكن Treeset سيتم فرزها تلقائيًا. إذا تعذر فرز الكائنات المخزنة ، فسيتم الإبلاغ عن خطأ ، لذلك يجب أن تحدد الكائنات المخزنة قواعد الفرز. تتضمن قواعد الفرز الفرز الطبيعي وفرز العملاء.
① الفرز الطبيعي: سيقوم الكائن بإضافة Treeset بتنفيذ واجهة java.lang.comparable التي فئة الكائن ، وتجاوز طريقة المقارنة (). العودة 0 يعني أنه نفس الكائن ، وإلا فهو كائن مختلف.
②Customer Sorting: إنشاء فئة من طرف ثالث وتنفيذ واجهة java.util.comparator. وإعادة كتابة الطريقة. تحديد مجموعة الأشجار Treeset TS = New Treeset (فئة جديدة من الطرف الثالث ()) ؛
يستخدم المثال التالي Treeset لتخزين الكائنات المرتبة بشكل طبيعي:
Package cn.set ؛ import java.util.set ؛ import java.util.treeset ؛ class student1 تنفذ قابلة للمقارنة <student1> {int id ؛ الطالب العام (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 (obj easuleof student1) {student1 stu = (student1) obj ؛ if (stu.id == this.id) return true ؛ } إرجاع خطأ ؛ } public int compareto (student1 o) {return (this.id-o.id) ؛ }} الفئة العامة TreeSettest {public static void main (string [] args) {set <Tudent1> set = new Treeset <Tudent1> () ؛ Student1 S1 = New Student1 (5) ؛ Student1 S2 = New Student1 (1) ؛ Student1 S3 = New Student1 (2) ؛ Student1 S4 = New Student1 (4) ؛ Student1 S5 = New Student1 (3) ؛ set.add (s1) ؛ set.add (S2) ؛ set.add (S3) ؛ set.add (S4) ؛ set.add (S5) ؛ لـ (student1 s: set) {system.out.println (s) ؛ }}} نتيجة الإخراج هي:
يستخدم المثال التالي Treeset لتخزين الكائنات المصنفة بالعميل:
package com.set ؛ import java.util.set ؛ import java.util.treeset ؛ class student1 تنفذ قابلة للمقارنة <student1> {int id ؛ الطالب العام (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 (obj easuleof student1) {student1 stu = (student1) obj ؛ if (stu.id == this.id) return true ؛ } إرجاع خطأ ؛ } public int compareto (student1 o) {return (this.id-o.id) ؛ }} الفئة العامة TreeSettest {public static void main (string [] args) {set <Tudent1> set = new Treeset <Tudent1> () ؛ Student1 S1 = New Student1 (5) ؛ Student1 S2 = New Student1 (1) ؛ Student1 S3 = New Student1 (2) ؛ Student1 S4 = New Student1 (4) ؛ Student1 S5 = New Student1 (3) ؛ set.add (s1) ؛ set.add (S2) ؛ set.add (S3) ؛ set.add (S4) ؛ set.add (S5) ؛ لـ (student1 s: set) {system.out.println (s) ؛ }}} نتيجة الإخراج هي:
يعلم الجميع أن القائمة يتم فرزها بترتيب الإدراج عند تخزينها. في الواقع ، يمكنك أيضًا فرز مجموعات القائمة عن طريق الفرز الطبيعي وفرز العملاء. من فضلك انظر:
package cn.set ؛ import java.util.arraylist ؛ import java.util.collections ؛ import java.util.list ؛ class mysort1 تنفذ java.util.comparator <student3> {public int compare (student3 o1 ، student3 o2) {return o2.id-o1.id ؛ }} class student3 تنفذ قابلة للمقارنة <student3> {int id ؛ الطالب العام 3 (int id) {this.id = id ؛ } Override Public String ToString () {return this.id+"" ؛ } public int compareto (student3 o) {return (this.id-o.id) ؛ }} الفئة العامة listsort {public static void main (string [] args) {list <Student3> list = new ArrayList <Student3> () ؛ Student3 S1 = New Student3 (5) ؛ Student3 S2 = New Student3 (1) ؛ Student3 S3 = New Student3 (2) ؛ Student3 S4 = New Student3 (4) ؛ Student3 S5 = New Student3 (3) ؛ list.add (s1) ؛ list.add (S2) ؛ list.add (S3) ؛ list.add (S4) ؛ list.add (S5) ؛ system.out.println (list) ؛ // الفرز الطبيعي: collections.sort (list) ؛ system.out.println (list) ؛ // مجموعة فرز العملاء. system.out.println (list) ؛ }} نتيجة الإخراج هي:
[5 ، 1 ، 2 ، 4 ، 3]
[1 ، 2 ، 3 ، 4 ، 5]
[5 ، 4 ، 3 ، 2 ، 1]
فيما يلي مبدأ مفاده أن واجهة مجموعة SET في Java لا تنفذ أي تكرار لإدخال الكائنات:
في مجموعة Java ، القاعدة لتحديد ما إذا كان كائنين متساوين هو:
1) تحديد ما إذا كانت ترميزات الكائنين متساوية
إذا لم يكن ذلك متساويًا ، يُعتبر أن الكائنين غير متساوين. إذا كانت متساوية ، فانتقل إلى 2)
(هذا مطلوب فقط لتحسين كفاءة التخزين. في الواقع ، من الممكن عدم وجود نظريًا ، ولكن إذا لم يكن الأمر كذلك ، فسيتم تقليل الكفاءة بشكل كبير أثناء الاستخدام الفعلي ، لذلك سنجعله ضروريًا هنا. ستركز هذه المشكلة لاحقًا.)
2) تحديد ما إذا كان يتم حساب الكائنين بالتساوي باستخدام متساوٍ
إذا لم يكن ذلك متساويًا ، فأعتقد أن الكائنين ليسا متساوين. إذا كان الأمر متساويًا ، فكر في أن الكائنين متساوين (متساوي () هو مفتاح الحكم على ما إذا كان الكائنان متساويان)
بالنسبة لكائنات الفئة العامة (باستثناء الكائنات المغلفة مثل السلسلة):
إذا لم تتجاوز الفئة العادية طرق Hashcode () و equals () ، ثم عند مقارنة الكائنات ، فإن طريقة hashcode () في فئة الكائن الموروثة ، طريقة hashcode () في فئة الكائن هي طريقة محلية. عند مقارنة قيمة الإرجاع للطريقة ، تتم مقارنة عنوان الكائن (عنوان المرجع). استخدم الطريقة الجديدة لإنشاء كائن بنفس المحتوى. بالطبع ، يتم إنشاء كائنات مختلفة مرتين. ما لم يتم تجاوز طريقة hashcode (). الطريقة المتساوية () المحددة في فئة الكائن هي أيضًا مقارنة عناوين الكائن. في كلمة واحدة: إذا لم تقم بإعادة كتابة أساليب Hashcode () و equals () للفئات العادية ، فإن عناوين مرجع الكائن تختلف في مجموعة SET ، ولن يتم تكرار الكائن.
للكائنات مثل السلسلة (السلسلة ، عدد صحيح ، مزدوج ... إلخ):
نظرًا لأن فئات التغليف هذه نفسها قد أعادت كتابة طريقة HashCode () ، وترتبط قيمة إرجاع طريقة إعادة الكتابة بمحتوى الكائن ، وليس إلى العنوان المرجعي. تتم إعادة كتابة طريقة متساوية () في هذه الفئات المغطاة ، ومقارنة محتوى الكائن بدلاً من العنوان المرجعي. في كلمة واحدة ، تقارن كائنات الفئات مثل String محتواها في المجموعة ، وإذا تم كتابة نفس المحتوى ، يتم تغطية الكائنات الموجودة.
ما سبق هو كل شيء عن هذا المقال ، آمل أن يكون مفيدًا لتعلم الجميع.