ฉันรู้ว่าLinkedHashMap
มีคำสั่งวนซ้ำที่คาดการณ์ได้ (คำสั่งแทรก) การSet
คืนสินค้าโดยLinkedHashMap.keySet()
และการCollection
ส่งคืนสินค้าLinkedHashMap.values()
ยังรักษาคำสั่งซื้อนี้หรือไม่
ฉันรู้ว่าLinkedHashMap
มีคำสั่งวนซ้ำที่คาดการณ์ได้ (คำสั่งแทรก) การSet
คืนสินค้าโดยLinkedHashMap.keySet()
และการCollection
ส่งคืนสินค้าLinkedHashMap.values()
ยังรักษาคำสั่งซื้อนี้หรือไม่
คำตอบ:
อินเทอร์เฟซแผนที่แสดงมุมมองการรวบรวมสาม มุมมองซึ่งอนุญาตให้ดูเนื้อหาของแผนที่เป็นชุดปุ่มการรวบรวมค่าหรือชุดการแมปคีย์ - ค่า การสั่งซื้อของแผนที่ถูกกำหนดให้เป็นลำดับที่ iterators ในมุมมองของคอลเลกชันของแผนที่กลับองค์ประกอบของพวกเขา การใช้งานแผนที่บางอย่างเช่น
TreeMap
คลาสรับประกันเฉพาะตามคำสั่งของพวกเขา อื่น ๆ เช่นHashMap
ชั้นเรียนทำไม่ได้
- แผนที่
รายการที่เชื่อมโยงนี้จะกำหนดลำดับการทำซ้ำซึ่งโดยปกติจะเป็นลำดับที่คีย์ถูกแทรกลงในแผนที่ ( คำสั่งแทรก )
ดังนั้นใช่keySet()
, values()
และentrySet()
(มุมมองที่คอลเลกชันสามที่กล่าวถึง) ค่าผลตอบแทนในการสั่งซื้อภายในเชื่อมโยงการใช้งานรายการ และใช่ JavaDoc สำหรับMap
และLinkedHashMap
รับประกัน
นั่นคือประเด็นของคลาสนี้หลังจากทั้งหมด
Collection
เป็นเพียงคลาสพื้นฐานสำหรับสิ่งที่ส่งกลับค่า () LinkedHashMap
การดำเนินงานของคอลเลกชันก็จะส่งกลับยังคงถูกควบคุมโดย ในLinkedHashMap
กรณีของมันจะส่งคืนLinkedValues
อินสแตนซ์คลาสส่วนตัวภายใน LinkedHashMap.java
Map
) ที่เชื่อมโยงคำสั่งแผนที่กับตัววนซ้ำอย่างชัดเจนในมุมมองคอลเล็กชันของแผนที่ (และทำให้ชัดเจนว่ามุมมองคอลเล็กชันเหล่านั้นคืออะไร) นั่นคือชิ้นส่วนที่ขาดหายไปสำหรับฉัน
ดูแหล่งที่มามันดูเหมือนว่าจะเป็น keySet()
, values()
และentrySet()
ทั้งหมดใช้ตัววนซ้ำรายการเดียวกันภายใน
อย่าสับสนกับLinkedHashMap.keySet()
และLinkedHashMap.entrySet()
ส่งคืน Set ดังนั้นจึงไม่ควรรับประกันการสั่งซื้อ!
Set
เป็นอินเตอร์เฟซที่มีHashSet
, TreeSet
สิ่งมีชีวิตอื่น ๆ การใช้งานของมัน การHashSet
ใช้Set
อินเตอร์เฟสไม่รับประกันการสั่งซื้อ แต่TreeSet
ไม่ ยังLinkedHashSet
ทำ
ดังนั้นจึงขึ้นอยู่กับวิธีSet
การนำไปใช้LinkedHashMap
เพื่อทราบว่าการอ้างอิงชุดส่งคืนจะรับประกันการสั่งซื้อหรือไม่ ฉันผ่านซอร์สโค้ดของLinkedHashMap
มันมีลักษณะดังนี้:
private final class KeySet extends AbstractSet<K> {...}
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {...}
ดังนั้น LinkedHashMap / HashMap มีการดำเนินการของตัวเองของคือSet
ดังนั้นอย่าสับสนนี้กับKeySet
HashSet
นอกจากนี้ยังคงรักษาลำดับโดยวิธีแทรกองค์ประกอบลงในที่ฝากข้อมูล ดูที่addEntry(..)
วิธีการLinkedHashMap
และเปรียบเทียบกับที่ของHashMap
ซึ่งไฮไลท์แตกต่างหลักระหว่างและHashMap
LinkedHashMap
คุณสามารถสันนิษฐานได้ Javadoc ระบุว่า 'คำสั่งวนซ้ำที่คาดการณ์ได้' และตัววนซ้ำที่มีอยู่ในแผนที่เท่านั้นคือชุดสำหรับ keySet (), entrySet () และค่า ()
ดังนั้นในกรณีที่ไม่มีคุณสมบัติเพิ่มเติมใด ๆ นั้นมีวัตถุประสงค์อย่างชัดเจนที่จะใช้กับตัววนซ้ำทั้งหมด
AFAIK ไม่มีการบันทึกไว้ดังนั้นคุณไม่สามารถ "เป็นทางการ" ได้ มันไม่น่าเป็นอย่างไรว่าการดำเนินงานในปัจจุบันจะเปลี่ยน
หากคุณต้องการให้มั่นใจในการสั่งซื้อคุณอาจต้องการวนซ้ำแผนที่และใส่ไว้ในชุดที่เรียงลำดับพร้อมกับฟังก์ชั่นการสั่งซื้อที่คุณเลือกแม้ว่าคุณจะจ่ายค่าประสิทธิภาพตามธรรมชาติ
มองไปที่อินเตอร์เฟซจะส่งกลับธรรมดาและไม่Set
SortedSet
ดังนั้นจึงมีการค้ำประกันไม่
ก่อนที่จะได้การรับประกันโดยปริยายโดยดูที่การดำเนินงาน (เสมอความคิดที่ดี) นอกจากนี้ยังมองไปที่การใช้งานในการใช้งาน Java อื่น ๆ ทั้งหมด :)
คุณควรสร้าง TreeSet ด้วยชุดคีย์ใน Constructor ได้ดีกว่า
ผมไม่คิดว่าคุณสามารถเข้าใจการสั่งซื้อของชุดคีย์ () และค่า ()
ฉันสามารถเขียนการใช้งานของ LinkedHashMap ที่คืนค่า keyset () และค่า () ที่ไม่มีการเรียงลำดับของคุณตราบใดที่ฉันยังคงติดสัญญาของทั้งสองวิธีที่กำหนดไว้ในแผนที่และแทนที่ใน HashMap
LinkedHashMap
ชั้นเรียนคือการรักษาลำดับขององค์ประกอบในขณะที่วนซ้ำแผนที่และพฤติกรรมนี้มีการระบุไว้อย่างดี หากคุณเขียนคลาสย่อยโดยไม่ปฏิบัติตามข้อกำหนดเฉพาะของคลาสพื้นฐานแสดงว่าคุณกำลังทำสิ่งผิดปกติมาก
values()
เช่นเดียวกับkeySet()
ฉันได้ขยายคำถามเพื่อรวมไว้ ซึ่งหมายความว่าสามารถปิดคำถามเพิ่มเติมได้เนื่องจากซ้ำซ้อน