"แล้วโปรเซสเซอร์ของคุณเป็นอย่างไรบ้าง"

"ไม่เป็นไร ฉันนั่งแช่ไนโตรเจนเหลวอยู่หนึ่งชั่วโมง ตอนนี้ฉันก็ดีเหมือนใหม่แล้ว!"

"เยี่ยมมาก งั้นไปต่อกันเถอะ"

"ชุดคอลเลกชัน"

ในทางคณิตศาสตร์ เซตคือกลุ่มขององค์ประกอบที่ไม่ซ้ำกัน ดังนั้น ในการเขียนโปรแกรม Set คือชุดขององค์ประกอบที่ไม่ซ้ำกัน กล่าวคือ คอลเลกชันที่ไม่อนุญาตให้คุณจัดเก็บองค์ประกอบที่เหมือนกัน

"ฉันไม่รู้ว่า Ellie แสดงลำดับชั้นการสืบทอดของ Set ให้คุณเห็นหรือไม่ ถ้าไม่ นี่คือ:"

การใช้งานอินเตอร์เฟส Set and Queue - 1

" HashSetคือคอลเลกชันที่เก็บองค์ประกอบไว้ภายในโดยใช้ค่าแฮชที่ส่งคืนโดยเมธอดhashCode ()"

"เพื่อความง่าย HashSet<E> เก็บวัตถุ HashMap<E, Object> ที่เก็บค่าของ HashSet เป็นคีย์"

"โว้ว!"

"การใช้รหัสแฮชทำให้คุณสามารถค้นหา เพิ่ม และลบองค์ประกอบออกจากชุดได้อย่างรวดเร็ว"

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

"ทั้งสองวิธีถูกใช้มากในHashSet/HashMap "

"หากคุณลืมใช้ เมธอด hashCode () คุณก็เสี่ยงที่จะไม่พบวัตถุของคุณใน Set แม้ว่าจะมีวัตถุนั้นอยู่ก็ตาม"

“ใช่ ฉันจำได้ ฉันจำได้ คุณบอกฉันเรื่องนี้ก่อนหน้านี้ ฉันได้ยินเรื่องนี้หมดแล้ว”

"ตกลง ต่อไปนี้เป็นข้อมูลที่เป็นประโยชน์สำหรับคุณ"

"สมมติว่าคุณติดตั้งhashCode อย่างถูกต้องและเท่ากับ ในชั้นเรียนของคุณ และคุณจัดเก็บวัตถุของคุณไว้ในชุดอย่างมีความสุข"

"แต่จากนั้นคุณไปเปลี่ยนออบเจกต์ตัวใดตัวหนึ่ง และด้วยการกระทำดังกล่าว คุณจะเปลี่ยนข้อมูลภายในที่ใช้ในการคำนวณแฮช ของมัน ดังนั้นแฮชของอ็อบเจกต์จึงเปลี่ยนไป"

"และนั่นหมายความว่าเมื่อคุณค้นหามันในชุด คุณอาจไม่พบมัน"

"โอ้โห! มันทำงานยังไง"

"นี่เป็นข้อผิดพลาดที่รู้จักกันดีเมื่อทำงานกับแฮช โดยพื้นฐานแล้ว การค้นหา HashSet (และ HashMap) จะรับประกันว่าจะทำงานได้อย่างถูกต้องหากวัตถุนั้นไม่เปลี่ยนรูปแบบ "

"โอ้โห! แล้วไง ไม่มีใครทำอะไรกับมันเลยเหรอ"

"ทุกคนแสร้งทำเป็นว่าปัญหาไม่มีอยู่จริง แต่สิ่งนี้มักจะเกิดขึ้นในการสัมภาษณ์ ดังนั้นจึงควรค่าแก่การจดจำ..."

" LinkedHashSetคือ HashSet ที่องค์ประกอบถูกจัดเก็บไว้ในรายการที่เชื่อมโยงเช่นกัน HashSet ปกติไม่รองรับการเรียงลำดับองค์ประกอบ ประการแรก มันไม่ใช่การดำเนินการอย่างเป็นทางการ ประการที่สอง แม้แต่ลำดับภายในก็สามารถเปลี่ยนแปลงได้อย่างมากเมื่อมีคำสั่งเดียว เพิ่มธาตุแล้ว”

แต่คุณสามารถรับ iterator จากLinkedHashSetและใช้มันเพื่อผ่านองค์ประกอบทั้งหมดตามลำดับที่เพิ่มไปยังLinkedHashSet มันไม่ได้เกิดขึ้นบ่อยนัก แต่บางครั้งก็จำเป็นมาก”

"ฉันเข้าใจแล้ว ฉันชอบเมื่อมีคลาสสำหรับสถานการณ์ «เผื่อกรณี» เหล่านี้ กรณีแบบนี้ไม่ได้หายากขนาดนั้น"

" TreeSetคือคอลเลกชั่นที่เก็บองค์ประกอบในรูปแบบของทรีที่เรียงลำดับตามค่า TreeSet <E>มีTreeMap <E, Object> ที่เก็บค่าเหล่านี้ทั้งหมด และTreeMap นี้ ใช้ ทรีแมป สีแดง - ดำที่สมดุล เพื่อจัดเก็บ องค์ประกอบด้วยเหตุนี้ จึงรองรับการเพิ่ม ลบ และบรรจุการดำเนินการที่รวดเร็วมาก"

"ใช่ ฉันจำได้ เราเพิ่งคุยกันเรื่องนั้นไม่นานมานี้ และฉันก็คิดด้วยว่าจะใช้ที่ไหน"

"และปรากฎว่าคอลเลกชั่นยอดนิยมของ Java บางส่วนใช้มัน"

"ใช่ อย่างไรก็ตาม ผู้สัมภาษณ์มักจะถามเกี่ยวกับTreeSetพวกเขามักจะพยายามหลอกคุณ พวกเขาจะพูดว่า 'ถ้า TreeSet ใช้ต้นไม้ไบนารี องค์ประกอบทั้งหมดสามารถประกอบกันเป็นกิ่งยาวหนึ่งกิ่ง ดังนั้นการค้นหาจะใช้เวลา เป็นเวลานาน «นี่เป็นเพียงเวลาที่จะทำให้คนอวดดีเข้ามาแทนที่โดยระบุว่า "แม้แต่เด็ก ๆ ก็รู้ว่า TreeSet และ TreeMap ใช้ต้นไม้สีแดง - ดำที่สมดุลดังนั้นสถานการณ์นั้นเป็นไปไม่ได้จริง ๆ »"

“อ่า ฉันอยากเห็นหน้าคนที่ถามคำถามนั้นจัง ฉันอาจจะจำประโยคนั้นได้…”

"แต่ในทางปฏิบัติ เซ็ตไม่ได้ง่ายอย่างที่ฉันคิดไว้ในตอนแรก"

"ในทางกลับกัน สถานการณ์ของQueueนั้นง่ายกว่ามาก:"

การใช้งานอินเตอร์เฟส Set and Queue - 2

" Queueใช้คิว องค์ประกอบจะถูกเพิ่มที่ส่วนท้ายของคิวและนำมาจากด้านหน้า"

" PriorityQueueเป็นการใช้งานแบบคลาสสิกเพียงอย่างเดียวของ อินเทอร์เฟ ซ Queueโดยไม่นับรวมLinkedListซึ่งในทางเทคนิคก็เป็นคิวด้วย"

“โอเค เหนื่อยแล้ว วันนี้พอแค่นี้ก่อน ไว้วันหน้า”