อินเทอร์เฟซชุดใน Java มีคุณสมบัติดังต่อไปนี้:
ไม่อนุญาตให้ใช้องค์ประกอบซ้ำ
องค์ประกอบในชุดไม่มีระเบียบ;
มีเพียงองค์ประกอบเดียวที่มีค่าของค่าว่าง
เนื่องจากอินเทอร์เฟซที่ตั้งไว้ใน Java เลียนแบบ Abstraction ชุดคณิตศาสตร์ลักษณะทางคณิตศาสตร์ที่สอดคล้องกันคือ:
เพศตรงข้ามซึ่งกันและกัน: ในชุดองค์ประกอบสององค์ประกอบใด ๆ จะถูกพิจารณาว่าแตกต่างกันนั่นคือแต่ละองค์ประกอบสามารถปรากฏขึ้นเพียงครั้งเดียว
ความผิดปกติ: ในชุดแต่ละองค์ประกอบมีสถานะเดียวกันและไม่เป็นระเบียบระหว่างองค์ประกอบ ความสัมพันธ์แบบต่อเนื่องสามารถกำหนดได้ในชุด หลังจากกำหนดความสัมพันธ์ในการสั่งซื้อองค์ประกอบสามารถจัดเรียงตามความสัมพันธ์ของคำสั่งซื้อ แต่ในแง่ของลักษณะของชุดตัวเองไม่มีคำสั่งที่จำเป็นระหว่างองค์ประกอบ
ลักษณะของชุดว่างเปล่า: ชุดว่างเป็นชุดย่อยของชุดทั้งหมด
ชุดไม่บันทึกองค์ประกอบที่ซ้ำกัน ชุดที่ใช้กันมากที่สุดคือแอตทริบิวต์การทดสอบคุณสามารถถามได้อย่างง่ายดายว่าวัตถุอยู่ในชุดหรือไม่ ชุดมีอินเทอร์เฟซเดียวกันกับคอลเลกชันดังนั้นจึงไม่มีฟังก์ชั่นพิเศษ ในความเป็นจริงชุดเป็นคอลเลกชัน แต่พฤติกรรมนั้นแตกต่างกัน
สิ่งสำคัญที่ใช้งานอินเทอร์เฟซที่ตั้งไว้คือ Hashset, Treeset และ LinkedHashSet ซึ่งเป็นจุดทั่วไปของแต่ละรายการเดียวกันจะถูกบันทึกเพียงหนึ่งสำเนา พวกเขายังมีความแตกต่างความแตกต่างมีดังนี้:
1.hashset:
HashSet ใช้วิธีที่ซับซ้อนมากในการจัดเก็บองค์ประกอบ การใช้ HashSet สามารถรับองค์ประกอบในคอลเลกชันได้เร็วที่สุดเท่าที่จะเป็นไปได้ซึ่งมีประสิทธิภาพมาก (สำหรับพื้นที่ในการแลกเปลี่ยนเวลา) ไม่ว่าจะเป็น pangduan วัตถุเดียวกันจะถูกกำหนดตาม hashcode และ equals หาก hashcode เหมือนกันและเท่ากับส่งคืนจริงมันเป็นวัตถุเดียวกันและไม่สามารถเก็บไว้ได้ซ้ำ ๆ
แพ็คเกจ cn.set; นำเข้า java.util.hashset; นำเข้า java.util.set; นักเรียนชั้นเรียน {int id; นักเรียนสาธารณะ (ID int) {this.id = id; } @Override สตริงสาธารณะ toString () {return this.id+""; } @Override public int hashCode () {return this.id; } @Override บูลีนสาธารณะเท่ากับ (Object obj) {ถ้า (OBJ Instanceof Student) {นักเรียน stu = (นักเรียน) obj; if (stu.id == this.id) ส่งคืนจริง; } return false; }} คลาสสาธารณะ hashSetTest {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {set <student> set = new hashset <student> (); นักเรียน 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 ไม่สามารถเก็บวัตถุที่ซ้ำกันได้ แต่ Treeet จะเรียงลำดับโดยอัตโนมัติ หากไม่สามารถจัดเรียงวัตถุที่เก็บไว้จะมีการรายงานข้อผิดพลาดดังนั้นวัตถุที่เก็บไว้จะต้องระบุกฎการเรียงลำดับ กฎการเรียงลำดับรวมถึงการเรียงลำดับตามธรรมชาติและการเรียงลำดับของลูกค้า
①การเรียงลำดับตามธรรมชาติ: วัตถุในการเพิ่มชุดต้นไม้จะใช้อินเทอร์เฟซ java.lang.comparable ที่คลาสวัตถุและแทนที่วิธีการเปรียบเทียบ () การกลับมา 0 หมายความว่ามันเป็นวัตถุเดียวกันมิฉะนั้นจะเป็นวัตถุที่แตกต่างกัน
②การเรียงลำดับการจัดเรียง: สร้างคลาสบุคคลที่สามและใช้อินเทอร์เฟซ Java.util.Comparator และเขียนวิธีใหม่ กำหนดคอลเลกชันแบบฟอร์ม TREESET TS = Treeset ใหม่ (คลาสบุคคลที่สามใหม่ ());
ตัวอย่างต่อไปนี้ใช้ Treeet เพื่อจัดเก็บวัตถุที่จัดเรียงตามธรรมชาติ:
แพ็คเกจ cn.set; นำเข้า java.util.set; นำเข้า java.util.treeset; Class Student1 ใช้เปรียบเทียบ <student1> {int id; นักศึกษาสาธารณะ 1 (int id) {this.id = id; } @Override สตริงสาธารณะ toString () {return this.id+""; } @Override public int hashCode () {return this.id; } @Override บูลีนสาธารณะเท่ากับ (Object obj) {ถ้า (OBJ Instanceof Student1) {Student1 Stu = (Student1) OBJ; if (stu.id == this.id) ส่งคืนจริง; } return false; } public int compereto (student1 o) {return (this.id-o.id); }} ชั้นเรียนสาธารณะ treeettest {โมฆะคงที่สาธารณะหลัก (String [] args) {set <student1> set = new Treeset <student1> (); นักเรียน 1 S1 = นักศึกษาใหม่ 1 (5); นักเรียน 1 S2 = นักศึกษาใหม่ 1 (1); Student1 S3 = นักศึกษาใหม่ 1 (2); นักเรียน 1 S4 = นักศึกษาใหม่ 1 (4); นักเรียน 1 S5 = นักศึกษาใหม่ 1 (3); set.add (S1); set.add (S2); set.add (S3); set.add (S4); set.add (S5); สำหรับ (Student1 S: set) {system.out.println (s); - ผลลัพธ์ผลลัพธ์คือ:
ตัวอย่างต่อไปนี้ใช้ Treeet เพื่อจัดเก็บวัตถุที่จัดเรียงของลูกค้า:
แพ็คเกจ com.set; นำเข้า java.util.set; นำเข้า java.util.treeset; Class Student1 ใช้การเปรียบเทียบ <Tudent1> {int ID; นักศึกษาสาธารณะ 1 (int id) {this.id = id; } @Override สตริงสาธารณะ toString () {return this.id+""; } @Override public int hashCode () {return this.id; } @Override บูลีนสาธารณะเท่ากับ (Object obj) {ถ้า (OBJ Instanceof Student1) {Student1 Stu = (Student1) OBJ; if (stu.id == this.id) ส่งคืนจริง; } return false; } public int compereto (student1 o) {return (this.id-o.id); }} ชั้นเรียนสาธารณะ treeettest {โมฆะคงที่สาธารณะหลัก (String [] args) {set <student1> set = new Treeset <student1> (); นักเรียน 1 S1 = นักศึกษาใหม่ 1 (5); นักเรียน 1 S2 = นักศึกษาใหม่ 1 (1); Student1 S3 = นักศึกษาใหม่ 1 (2); นักเรียน 1 S4 = นักศึกษาใหม่ 1 (4); นักเรียน 1 S5 = นักศึกษาใหม่ 1 (3); set.add (S1); set.add (S2); set.add (S3); set.add (S4); set.add (S5); สำหรับ (Student1 S: set) {system.out.println (s); - ผลลัพธ์ผลลัพธ์คือ:
ทุกคนรู้ว่ารายการถูกจัดเรียงตามลำดับของการแทรกเมื่อเก็บไว้ ในความเป็นจริงคุณยังสามารถจัดเรียงรายการคอลเลกชันโดยการเรียงลำดับตามธรรมชาติและการเรียงลำดับของลูกค้า โปรดดู:
แพ็คเกจ cn.set; นำเข้า java.util.arraylist; นำเข้า java.util.collections; นำเข้า java.util.list; Class MySort1 ใช้ java.util.Comparator <Tudent3> {Public Int Compare (Student3 O1, Student3 O2) }} คลาสนักเรียน 3 ใช้การเปรียบเทียบ <Tudent3> {int id; นักศึกษาสาธารณะ 3 (int id) {this.id = id; } @Override สตริงสาธารณะ toString () {return this.id+""; } public int compereto (student3 o) {return (this.id-o.id); }} คลาสสาธารณะ LISTSORT {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {รายการ <Tudent3> list = new ArrayList <นักเรียน 3> (); นักเรียน 3 S1 = นักศึกษาใหม่ 3 (5); นักเรียน 3 S2 = นักศึกษาใหม่ 3 (1); นักเรียน 3 S3 = ใหม่นักศึกษา 3 (2); นักเรียน 3 S4 = นักศึกษาใหม่ 3 (4); นักเรียน 3 S5 = ใหม่นักศึกษา 3 (3); list.add (S1); list.add (S2); list.add (S3); list.add (S4); list.add (S5); System.out.println (รายการ); // การเรียงลำดับตามธรรมชาติ: collections.sort (รายการ); System.out.println (รายการ); // collection collections collections.sort (รายการ, mysort1 ใหม่ ()); System.out.println (รายการ); - ผลลัพธ์ผลลัพธ์คือ:
[5, 1, 2, 4, 3]
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]
ต่อไปนี้เป็นหลักการที่ว่าชุดอินเทอร์เฟซคอลเลกชันใน Java ไม่ได้ใช้ความซ้ำซ้อนของการแทรกวัตถุ:
ในคอลเลกชัน Java กฎเพื่อตรวจสอบว่าวัตถุสองชิ้นมีค่าเท่ากันหรือไม่:
1) ตรวจสอบว่า hashcodes ของวัตถุทั้งสองมีค่าเท่ากันหรือไม่
หากไม่เท่ากันก็จะพิจารณาว่าวัตถุทั้งสองไม่เท่ากัน ถ้าเท่ากันให้เปิด 2)
(นี่เป็นสิ่งจำเป็นในการปรับปรุงประสิทธิภาพการจัดเก็บในความเป็นจริงมันเป็นไปได้ที่จะไม่มีทางทฤษฎี แต่ถ้าไม่ประสิทธิภาพจะลดลงอย่างมากในระหว่างการใช้งานจริงดังนั้นเราจะทำให้มันจำเป็นที่นี่ปัญหานี้จะเน้นในภายหลัง)
2) ตรวจสอบว่าวัตถุทั้งสองนั้นถูกคำนวณอย่างเท่าเทียมกันโดยใช้เท่ากับ
หากไม่เท่ากันคิดว่าวัตถุทั้งสองไม่เท่ากัน ถ้าเท่ากันคิดว่าวัตถุทั้งสองมีค่าเท่ากัน (Equals () เป็นกุญแจสำคัญในการตัดสินว่าวัตถุทั้งสองเท่ากัน)
สำหรับวัตถุคลาสทั่วไป (ยกเว้นวัตถุที่ห่อหุ้มเช่นสตริง):
หากคลาสสามัญไม่ได้แทนที่วิธี HashCode () และ Equals () จากนั้นเมื่อเปรียบเทียบวัตถุวิธี HashCode () ในคลาสวัตถุที่สืบทอดมานั้นวิธี HashCode () ในคลาสวัตถุเป็นวิธีการท้องถิ่น เมื่อเปรียบเทียบค่าส่งคืนของวิธีการที่อยู่วัตถุ (ที่อยู่อ้างอิง) จะถูกเปรียบเทียบ ใช้วิธีการใหม่เพื่อสร้างวัตถุที่มีเนื้อหาเดียวกัน แน่นอนว่าวัตถุต่าง ๆ ถูกสร้างขึ้นสองครั้ง เว้นแต่วิธีการ HashCode () จะถูกแทนที่ วิธี Equals () ที่กำหนดไว้ในคลาสวัตถุก็เป็นการเปรียบเทียบที่อยู่วัตถุ ในคำว่า: หากคุณไม่ได้เขียนวิธีการ HashCode () และ Equals () ของคลาสสามัญที่อยู่อ้างอิงวัตถุจะแตกต่างกันในคอลเลกชันชุดและวัตถุจะไม่ถูกทำซ้ำ
สำหรับวัตถุเช่นสตริง (สตริง, จำนวนเต็ม, สองเท่า ... ฯลฯ ):
เนื่องจากคลาส encapsulation เหล่านี้เองได้เขียนวิธี HashCode () ใหม่และค่าการส่งคืนของวิธีการที่เขียนใหม่นั้นเกี่ยวข้องกับเนื้อหาของวัตถุไม่ใช่ที่อยู่อ้างอิง วิธีการ Equals () ในคลาสที่ห่อหุ้มเหล่านี้ถูกเขียนขึ้นใหม่โดยเปรียบเทียบเนื้อหาของวัตถุมากกว่าที่อยู่อ้างอิง ในคำว่าวัตถุของคลาสเช่นสตริงเปรียบเทียบเนื้อหาของพวกเขาในคอลเลกชันและหากเนื้อหาเดียวกันถูกเขียนทับวัตถุที่มีอยู่จะถูกครอบคลุม
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน