ฉันรู้ว่า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 ดังนั้นอย่าสับสนนี้กับKeySetHashSet
นอกจากนี้ยังคงรักษาลำดับโดยวิธีแทรกองค์ประกอบลงในที่ฝากข้อมูล ดูที่addEntry(..)วิธีการLinkedHashMapและเปรียบเทียบกับที่ของHashMapซึ่งไฮไลท์แตกต่างหลักระหว่างและHashMapLinkedHashMap
คุณสามารถสันนิษฐานได้ Javadoc ระบุว่า 'คำสั่งวนซ้ำที่คาดการณ์ได้' และตัววนซ้ำที่มีอยู่ในแผนที่เท่านั้นคือชุดสำหรับ keySet (), entrySet () และค่า ()
ดังนั้นในกรณีที่ไม่มีคุณสมบัติเพิ่มเติมใด ๆ นั้นมีวัตถุประสงค์อย่างชัดเจนที่จะใช้กับตัววนซ้ำทั้งหมด
AFAIK ไม่มีการบันทึกไว้ดังนั้นคุณไม่สามารถ "เป็นทางการ" ได้ มันไม่น่าเป็นอย่างไรว่าการดำเนินงานในปัจจุบันจะเปลี่ยน
หากคุณต้องการให้มั่นใจในการสั่งซื้อคุณอาจต้องการวนซ้ำแผนที่และใส่ไว้ในชุดที่เรียงลำดับพร้อมกับฟังก์ชั่นการสั่งซื้อที่คุณเลือกแม้ว่าคุณจะจ่ายค่าประสิทธิภาพตามธรรมชาติ
มองไปที่อินเตอร์เฟซจะส่งกลับธรรมดาและไม่Set SortedSetดังนั้นจึงมีการค้ำประกันไม่
ก่อนที่จะได้การรับประกันโดยปริยายโดยดูที่การดำเนินงาน (เสมอความคิดที่ดี) นอกจากนี้ยังมองไปที่การใช้งานในการใช้งาน Java อื่น ๆ ทั้งหมด :)
คุณควรสร้าง TreeSet ด้วยชุดคีย์ใน Constructor ได้ดีกว่า
ผมไม่คิดว่าคุณสามารถเข้าใจการสั่งซื้อของชุดคีย์ () และค่า ()
ฉันสามารถเขียนการใช้งานของ LinkedHashMap ที่คืนค่า keyset () และค่า () ที่ไม่มีการเรียงลำดับของคุณตราบใดที่ฉันยังคงติดสัญญาของทั้งสองวิธีที่กำหนดไว้ในแผนที่และแทนที่ใน HashMap
LinkedHashMapชั้นเรียนคือการรักษาลำดับขององค์ประกอบในขณะที่วนซ้ำแผนที่และพฤติกรรมนี้มีการระบุไว้อย่างดี หากคุณเขียนคลาสย่อยโดยไม่ปฏิบัติตามข้อกำหนดเฉพาะของคลาสพื้นฐานแสดงว่าคุณกำลังทำสิ่งผิดปกติมาก
values()เช่นเดียวกับkeySet()ฉันได้ขยายคำถามเพื่อรวมไว้ ซึ่งหมายความว่าสามารถปิดคำถามเพิ่มเติมได้เนื่องจากซ้ำซ้อน