การเริ่มต้น HashSet ในช่วงเวลาของการก่อสร้าง

1. ภาพรวม

ในการกวดวิชาอย่างนี้เราจะแนะนำวิธีการต่างๆของการเริ่มต้นHashSetกับค่านิยมในช่วงเวลาของการก่อสร้าง

หากคุณต้องการสำรวจคุณลักษณะของHashSetแทนโปรดดูบทความหลักที่นี่

เราจะดำน้ำใน Java ในตัววิธีตั้งแต่ Java 5 และก่อนที่จะตามด้วยใหม่กลไกการแนะนำตั้งแต่ Java 8 นอกจากนี้เราจะเห็นวิธียูทิลิตี้ที่กำหนดเองและในที่สุดก็สำรวจคุณสมบัติที่จัดทำโดยไลบรารีคอลเลกชันของบุคคลที่สามโดยเฉพาะ Google Guava

หากคุณโชคดีที่ได้ย้ายไปที่ JDK9 + แล้วคุณสามารถใช้วิธีการรวบรวมโรงงานได้

2. วิธีการในตัว Java

ขอเริ่มต้นด้วยการตรวจสอบสามตัวในกลไกที่มีอยู่ตั้งแต่ Java 5 หรือก่อน

2.1. การใช้อินสแตนซ์คอลเลคชันอื่น

เราสามารถส่งผ่านที่มีอยู่เช่นการจัดเก็บอีกเพื่อเริ่มต้นการตั้งค่า ในตัวอย่างด้านล่างเรากำลังใช้รายการที่สร้างแบบอินไลน์:

Set set = new HashSet(Arrays.asList("a", "b", "c"));

2.2. การใช้คลาส Anonymous

ในยังอีกวิธีหนึ่งที่เราสามารถใช้คลาสที่ไม่ระบุชื่อที่จะเพิ่มองค์ประกอบที่จะHashSet

สังเกตการใช้วงเล็บปีกกาสองชั้น วิธีนี้มีราคาแพงมากในทางเทคนิคเนื่องจากสร้างคลาสที่ไม่ระบุตัวตนทุกครั้งที่เรียก

ดังนั้นขึ้นอยู่กับความถี่ที่เราต้องเริ่มต้นSetเราสามารถพยายามหลีกเลี่ยงการใช้วิธีนี้:

Set set = new HashSet(){{ add("a"); add("b"); add("c"); }};

2.3. การใช้ Collections Utility Method ตั้งแต่ Java 5

ของ Java คอลเลกชันยูทิลิตี้ชั้นมีวิธีที่มีชื่อเดี่ยวในการสร้างชุดที่มีองค์ประกอบเดียว ตั้งอินสแตนซ์ที่สร้างขึ้นด้วยเดี่ยวเป็นวิธีการที่ไม่เปลี่ยนรูปความหมายว่าเราไม่สามารถสร้างมูลค่าเพิ่มให้กับมัน

มีสถานการณ์โดยเฉพาะอย่างยิ่งในการทดสอบหน่วยที่เราต้องสร้างชุดที่มีค่าเดียว:

Set set = Collections.singleton("a");

3. การกำหนดวิธียูทิลิตี้แบบกำหนดเอง

เราสามารถกำหนดวิธีสุดท้ายแบบคงที่ได้ดังต่อไปนี้ วิธีการที่ยอมรับข้อโต้แย้งตัวแปร

การใช้Collections.addAllซึ่งยอมรับอ็อบเจ็กต์คอลเลคชันและอาร์เรย์ของค่าจะดีที่สุดเนื่องจากค่าใช้จ่ายในการคัดลอกต่ำ

วิธีการใช้ยาชื่อสามัญเพื่อให้เราสามารถส่งผ่านค่าของชนิดใด ๆ :

public static final  Set newHashSet(T... objs) { Set set = new HashSet(); Collections.addAll(set, objs); return set; }

สามารถใช้วิธียูทิลิตี้ในโค้ดของเราได้ดังนี้

Set set = newHashSet("a","b","c");

4. ใช้Streamตั้งแต่ Java 8

ด้วยการแนะนำStream API ใน Java 8 เรามีตัวเลือกเพิ่มเติม เราสามารถใช้StreamกับCollectors ได้ดังที่แสดงในโค้ดด้านล่าง:

Set set = Stream.of("a", "b", "c") .collect(Collectors.toCollection(HashSet::new));

5. การใช้ห้องสมุดคอลเลกชันของบุคคลที่สาม

มีไลบรารีคอลเล็กชันของบุคคลที่สามหลายแห่งรวมถึง Google Guava, Apache Commons Collections และ Eclipse Collections เพื่อตั้งชื่อไม่กี่แห่ง

ไลบรารีเหล่านี้มีวิธียูทิลิตี้ที่สะดวกในการเริ่มต้นคอลเล็กชันเช่น Set เนื่องจากGoogle Guavaเป็นหนึ่งในเครื่องมือที่ใช้กันมากที่สุดที่นี่เราจึงมีตัวอย่างจากมัน Guava มีวิธีการที่สะดวกสำหรับวัตถุSet ที่ไม่เปลี่ยนแปลงและไม่เปลี่ยนรูป:

Set set = Sets.newHashSet("a", "b", "c");

ในทำนองเดียวกัน Guava มีคลาสยูทิลิตี้สำหรับสร้างอินสแตนซ์Set ที่ไม่เปลี่ยนรูปดังที่เราเห็นในตัวอย่างด้านล่าง

Set set = ImmutableSet.of("a", "b", "c");

6. บทสรุป

สรุปได้ว่าเราเห็นหลายวิธีที่สามารถเริ่มต้นHashSetได้ในขณะที่สร้าง แนวทางเหล่านี้ไม่จำเป็นต้องครอบคลุมทุกวิธีที่เป็นไปได้ด้วยวิธีการใด ๆ เป็นเพียงความพยายามที่จะแสดงวิธีการทั่วไป

หนึ่งในวิธีการดังกล่าวไม่ครอบคลุมที่นี่อาจจะใช้สร้างวัตถุเพื่อสร้างชุด

เช่นเคยมีตัวอย่างโค้ดที่ใช้งานได้บน GitHub