มีการรับประกันคำสั่งซื้อสำหรับการส่งคืนคีย์และค่าจากวัตถุ LinkedHashMap หรือไม่?


162

ฉันรู้ว่าLinkedHashMapมีคำสั่งวนซ้ำที่คาดการณ์ได้ (คำสั่งแทรก) การSetคืนสินค้าโดยLinkedHashMap.keySet()และการCollectionส่งคืนสินค้าLinkedHashMap.values()ยังรักษาคำสั่งซื้อนี้หรือไม่


1
เนื่องจากคำตอบทั้งหมดตอบปัญหาvalues()เช่นเดียวกับkeySet()ฉันได้ขยายคำถามเพื่อรวมไว้ ซึ่งหมายความว่าสามารถปิดคำถามเพิ่มเติมได้เนื่องจากซ้ำซ้อน
Duncan Jones

คำตอบ:


226

อินเทอร์เฟซแผนที่แสดงมุมมองการรวบรวมสาม มุมมองซึ่งอนุญาตให้ดูเนื้อหาของแผนที่เป็นชุดปุ่มการรวบรวมค่าหรือชุดการแมปคีย์ - ค่า การสั่งซื้อของแผนที่ถูกกำหนดให้เป็นลำดับที่ iterators ในมุมมองของคอลเลกชันของแผนที่กลับองค์ประกอบของพวกเขา การใช้งานแผนที่บางอย่างเช่นTreeMap คลาสรับประกันเฉพาะตามคำสั่งของพวกเขา อื่น ๆ เช่น HashMapชั้นเรียนทำไม่ได้

- แผนที่

รายการที่เชื่อมโยงนี้จะกำหนดลำดับการทำซ้ำซึ่งโดยปกติจะเป็นลำดับที่คีย์ถูกแทรกลงในแผนที่ ( คำสั่งแทรก )

- LinkedHashMap

ดังนั้นใช่keySet(), values()และentrySet()(มุมมองที่คอลเลกชันสามที่กล่าวถึง) ค่าผลตอบแทนในการสั่งซื้อภายในเชื่อมโยงการใช้งานรายการ และใช่ JavaDoc สำหรับMapและLinkedHashMapรับประกัน

นั่นคือประเด็นของคลาสนี้หลังจากทั้งหมด


8
การทำซ้ำบนแผนที่ก็ทำได้เร็วขึ้นด้วยการใช้ LinkedHashMap กว่า HashMap
ธีรี่ร์

2
values ​​() ส่งคืนคอลเล็กชัน ไม่ใช่รายการ มันเก็บไว้อย่างเป็นระเบียบได้อย่างไร?
Dejell

7
@Dejel Collectionเป็นเพียงคลาสพื้นฐานสำหรับสิ่งที่ส่งกลับค่า () LinkedHashMapการดำเนินงานของคอลเลกชันก็จะส่งกลับยังคงถูกควบคุมโดย ในLinkedHashMapกรณีของมันจะส่งคืนLinkedValuesอินสแตนซ์คลาสส่วนตัวภายใน LinkedHashMap.java
Powerlord

2
ชุดคีย์ของ LinkedHashMap ในกรณีของฉันไม่อยู่ในลำดับที่แสดงในแผนที่ งงงวยมากกับสิ่งนี้
Amalgovinus

2
ขอขอบคุณที่เชื่อมโยงไปยังเอกสารประกอบ (จากMap) ที่เชื่อมโยงคำสั่งแผนที่กับตัววนซ้ำอย่างชัดเจนในมุมมองคอลเล็กชันของแผนที่ (และทำให้ชัดเจนว่ามุมมองคอลเล็กชันเหล่านั้นคืออะไร) นั่นคือชิ้นส่วนที่ขาดหายไปสำหรับฉัน
LarsH

11

ดูแหล่งที่มามันดูเหมือนว่าจะเป็น keySet(), values()และentrySet()ทั้งหมดใช้ตัววนซ้ำรายการเดียวกันภายใน


1
มันจะเจ๋งถ้ามีลิงค์ไปยัง repos แต่ฉันขี้เกียจ :-) และแน่นอนมันไม่ได้รับประกันความเข้ากันได้ของฟอร์เวิร์ด
Ciro Santilli 法轮功冠状病六四事件法轮功

6

อย่าสับสนกับ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


4
ในขณะที่คำตอบนี้แน่นอนนำเสนอข้อมูลที่เป็นประโยชน์มันไม่ได้โดดตอบคำถาม โดยพื้นฐานแล้วพวกเขาสามารถคาดคะเนซ้ำได้
Tuupertunut

5

คุณสามารถสันนิษฐานได้ Javadoc ระบุว่า 'คำสั่งวนซ้ำที่คาดการณ์ได้' และตัววนซ้ำที่มีอยู่ในแผนที่เท่านั้นคือชุดสำหรับ keySet (), entrySet () และค่า ()

ดังนั้นในกรณีที่ไม่มีคุณสมบัติเพิ่มเติมใด ๆ นั้นมีวัตถุประสงค์อย่างชัดเจนที่จะใช้กับตัววนซ้ำทั้งหมด


0

AFAIK ไม่มีการบันทึกไว้ดังนั้นคุณไม่สามารถ "เป็นทางการ" ได้ มันไม่น่าเป็นอย่างไรว่าการดำเนินงานในปัจจุบันจะเปลี่ยน

หากคุณต้องการให้มั่นใจในการสั่งซื้อคุณอาจต้องการวนซ้ำแผนที่และใส่ไว้ในชุดที่เรียงลำดับพร้อมกับฟังก์ชั่นการสั่งซื้อที่คุณเลือกแม้ว่าคุณจะจ่ายค่าประสิทธิภาพตามธรรมชาติ


คุณหมายถึง entrySet () รับประกันการสั่งซื้อโดย keySet () ไม่ใช่หรือไม่
user256239

1
@ kknight: ฉันไม่แน่ใจ javadoc กล่าวว่า: "รายการที่เชื่อมโยงนี้จะกำหนดลำดับการทำซ้ำซึ่งโดยปกติจะเป็นคำสั่งที่คีย์ถูกแทรกลงในแผนที่ (คำสั่งแทรก)" อย่างไรก็ตาม JavaDocs สำหรับ JDK นั้นคลุมเครือโดยทั่วไป
ยูริ

5
หาก entrySet () ไม่รับประกันการสั่งซ้ำซ้ำแล้วความแตกต่างระหว่าง LinkedHashMap และ HashMap คืออะไร? เราจะใช้ประโยชน์จากลำดับการทำซ้ำที่คาดเดาได้ในอินสแตนซ์ LinkedHashMap ได้อย่างไร
user256239

1
มันเป็นเอกสารที่แน่นอนที่สุด คำตอบไม่ถูกต้องสมบูรณ์
มาร์ควิสแห่ง Lorne

-3

มองไปที่อินเตอร์เฟซจะส่งกลับธรรมดาและไม่Set SortedSetดังนั้นจึงมีการค้ำประกันไม่

ก่อนที่จะได้การรับประกันโดยปริยายโดยดูที่การดำเนินงาน (เสมอความคิดที่ดี) นอกจากนี้ยังมองไปที่การใช้งานในการใช้งาน Java อื่น ๆ ทั้งหมด :)

คุณควรสร้าง TreeSet ด้วยชุดคีย์ใน Constructor ได้ดีกว่า


3
มองอย่างใกล้ชิดที่เอกสารมีการรับประกันแน่นอน ดังที่มีคนเขียนไปแล้วนั่นคือจุดสำคัญของคลาสนี้
glglgl

-4

ผมไม่คิดว่าคุณสามารถเข้าใจการสั่งซื้อของชุดคีย์ () และค่า ()

ฉันสามารถเขียนการใช้งานของ LinkedHashMap ที่คืนค่า keyset () และค่า () ที่ไม่มีการเรียงลำดับของคุณตราบใดที่ฉันยังคงติดสัญญาของทั้งสองวิธีที่กำหนดไว้ในแผนที่และแทนที่ใน HashMap


6
จุดประสงค์ทั้งหมดของLinkedHashMapชั้นเรียนคือการรักษาลำดับขององค์ประกอบในขณะที่วนซ้ำแผนที่และพฤติกรรมนี้มีการระบุไว้อย่างดี หากคุณเขียนคลาสย่อยโดยไม่ปฏิบัติตามข้อกำหนดเฉพาะของคลาสพื้นฐานแสดงว่าคุณกำลังทำสิ่งผิดปกติมาก
zakinster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.