ความแตกต่างระหว่าง HashSet และ HashMap?


168

นอกเหนือจากความจริงที่HashSetไม่อนุญาตให้มีค่าซ้ำกันความแตกต่างระหว่างHashMapและHashSetคืออะไร

ฉันหมายถึงการนำไปปฏิบัติอย่างชาญฉลาด? มันค่อนข้างคลุมเครือเพราะทั้งคู่ใช้ตารางแฮชเพื่อเก็บค่า


HashSet จะดำเนินการใช้ HashMap
therealprashant

ฉันคิดว่าการรู้ว่าทำไม HashSet นั้นแตกต่างจาก ArrayList จะช่วยให้คุณเข้าใจคำตอบของคำถามข้างต้น: stackoverflow.com/questions/18706870/…
djangofan

คำตอบ:


150

พวกเขาเป็นโครงสร้างที่แตกต่างกันอย่างสิ้นเชิง คือการดำเนินการHashMap แผนที่แผนที่กุญแจสู่ค่า การค้นหาคีย์เกิดขึ้นโดยใช้แฮชMap

บนมืออื่น ๆ ที่เป็นคือการดำเนินการHashSet ชุดถูกออกแบบมาเพื่อให้ตรงกับแบบจำลองทางคณิตศาสตร์ของชุด A ใช้เพื่อสนับสนุนการใช้งานตามที่คุณบันทึกไว้ อย่างไรก็ตามมันใช้อินเทอร์เฟซที่แตกต่างอย่างสิ้นเชิงSetHashSetHashMap

เมื่อคุณกำลังมองหาสิ่งที่ดีที่สุดCollectionสำหรับจุดประสงค์ของคุณการสอนนี้เป็นจุดเริ่มต้นที่ดี ถ้าคุณอยากรู้ว่าเกิดอะไรขึ้นจริง ๆก็มีหนังสือเล่มนั้นอยู่ด้วย


คำสั่งนั้นค่อนข้างง่าย มีบางอย่างเกิดขึ้นภายใต้หน้ากาก "" ส่งคืนค่าแฮชสำหรับวัตถุที่ระบุ นอกจากนี้ในการ hashCode เองของวัตถุวิธีการนี้จะนำไปใช้เป็น "ฟังก์ชันแฮชเสริม" ซึ่งปกป้องยากจนฟังก์ชันแฮชที่มีคุณภาพ นี่เป็นสิ่งสำคัญเนื่องจาก HashMap ใช้ตารางแฮชยาวสองตาราง " weblogs.java.net/blog/2005/06/18/hashmap-implementation - อย่างไรก็ตามหากคุณดูเอกสารคุณจะเห็นว่าแฮชนี้กระจายสิ่งต่าง ๆ เหนือ "buckets" ดังนั้นในที่สุดฉันเชื่อว่าสองสิ่งสามารถแมปกลุ่มเดียวกันได้
justkt

1
เพื่อตอบคำถามที่สองของคุณ - ไม่ แผนที่คือถ้าคุณต้องการ (คีย์ -> ค่า) ตามที่กำหนดโดยคำตอบที่ยอดเยี่ยมของ @Bruno Rothgiesser ชุดสำหรับองค์ประกอบที่ไม่ซ้ำกัน หากคุณต้องการทำซ้ำและไม่ใช่ค่าคีย์ -> ฉันจะตรวจสอบการใช้งาน java.util.List ลองดูบทแนะนำการใช้งานคอลเล็กชัน: java.sun.com/docs/books/tutorial/collections/index.html
justkt

@justk: ใช่คุณสามารถรับคีย์ได้สองปุ่มในที่เก็บข้อมูลหนึ่งชุดจากนั้นเท่ากับ () ใช้เพื่อแยกความแตกต่างระหว่างปุ่มเหล่านั้น นั่นเป็นสาเหตุที่จำเป็นที่ hashCode () และ equals () เข้ากันได้
Michael Borgwardt

6
@SpikETidE: ทั้ง HashMap และ HashSet ไม่อนุญาตการทำซ้ำ นั่นคือประเด็นทั้งหมด
Michael Borgwardt

23
@SpikETidE: ชุดไม่มีคู่คีย์ / ค่าองค์ประกอบเท่านั้น และ HashSet นั้นถูกนำไปใช้โดยการใช้ HashMap ที่มีองค์ประกอบ set เป็นคีย์และค่าที่ถูกละเว้น
Michael Borgwardt

300

HashSet เป็นชุดเช่น{1,2,3,4,5}

HashMap เป็นแผนที่สำคัญ -> ค่า (กุญแจถึงค่า) แผนที่เช่น{a -> 1, b -> 2, c -> 2, d -> 1}

โปรดสังเกตในตัวอย่างของฉันด้านบนว่าใน HashMap ต้องไม่มีคีย์ที่ซ้ำกัน แต่อาจมีค่าซ้ำกัน

ใน HashSet จะต้องไม่มีองค์ประกอบที่ซ้ำกัน


แต่เหตุผล (ที่น่าสนใจที่สุด) สำหรับความสับสนก็คือแม้ใน HashSet คุณต้องมี "กุญแจ" เพื่อเข้าถึงองค์ประกอบ เช่นวัตถุแม้ในคณิตศาสตร์มีชื่อ (หรือที่อยู่) หากพวกเขาจะสามารถเข้าถึงหรืออ้างอิง ดังนั้นในความเป็นจริง HashSet จึงเป็น HashMap ที่เรียบง่ายเป็นพิเศษโดยพิมพ์ชื่อ (หรือที่อยู่) ขององค์ประกอบต่างๆ
แอนดรูมาร์แชลล์

65

HashSet

  1. คลาส HashSet ใช้อินเตอร์เฟส Set
  2. ใน HashSet เราเก็บวัตถุ (องค์ประกอบหรือค่า) เช่นถ้าเรามี HashSet ขององค์ประกอบสตริงแล้วมันสามารถพรรณนาชุดขององค์ประกอบ HashSet: {“ Hello”,“ Hi”,“ Bye”,“ Run”}
  3. HashSet ไม่อนุญาตให้มีองค์ประกอบที่ซ้ำกันซึ่งหมายความว่าคุณไม่สามารถเก็บค่าที่ซ้ำกันใน HashSet
  4. HashSet อนุญาตให้มีค่า Null เดียว
  5. HashSet ไม่ได้ทำการซิงโครไนซ์ซึ่งหมายความว่ามันไม่เหมาะสำหรับการดำเนินการกับเธรดที่ปลอดภัยจนกว่าจะไม่ซิงโครไนซ์อย่างชัดเจน

                          add      contains next     notes
    HashSet               O(1)     O(1)     O(h/n)   h is the table 

HashMap

  1. คลาส HashMap ใช้อินเตอร์เฟส Map
  2. HashMap ใช้สำหรับจัดเก็บคู่คีย์ & ค่า กล่าวโดยย่อคือรักษาการทำแผนที่ของคีย์ & ค่า (คลาส HashMap นั้นเทียบเท่ากับ Hashtable ยกเว้นว่ามันไม่ได้ซิงโครไนซ์และอนุญาต null) นี่คือวิธีที่คุณสามารถแสดงองค์ประกอบ HashMap ได้ถ้ามันมีคีย์จำนวนเต็มและค่าของประเภทสตริง: เช่น {1 ->” Hello”, 2 ->” Hi”, 3 ->” Bye”, 4 ->” Run”}
  3. HashMap ไม่อนุญาตให้ใช้คีย์ซ้ำ แต่อนุญาตให้มีค่าซ้ำกัน
  4. HashMap อนุญาตให้ใช้คีย์ null เดียวและจำนวนค่า null ใด ๆ
  5. HashMap ไม่ได้รับการซิงโครไนซ์ซึ่งหมายความว่าพวกเขาไม่เหมาะสำหรับการดำเนินการที่ปลอดภัยต่อเธรดจนกว่าจะมีการซิงโครไนซ์อย่างชัดเจน [ความคล้ายคลึงกัน]

                           get      containsKey next     Notes
     HashMap               O(1)     O(1)        O(h/n)   h is the table 

โปรดอ้างอิงบทความนี้เพื่อค้นหาข้อมูลเพิ่มเติม


36

มันจริงๆความอัปยศที่ทั้งชื่อของพวกเขาเริ่มต้นด้วยการแฮ นั่นคือส่วนที่สำคัญที่สุดของพวกเขา ส่วนสำคัญมาจากHash - SetและMapตามที่คนอื่น ๆ ได้ชี้ให้เห็น สิ่งที่พวกเขาตามลำดับคือชุด - ชุดสะสมที่ไม่ได้เรียงลำดับ - และแผนที่ - ชุดสะสมพร้อมการเข้าถึงแบบมีกุญแจ พวกมันถูกนำมาใช้กับแฮชนั่นคือที่มาของชื่อ - แต่สาระสำคัญของพวกเขาถูกซ่อนอยู่หลังชื่อของส่วนนั้น

อย่าสับสนกับชื่อของพวกเขา พวกเขาต่างกันอย่างลึกซึ้ง


@HiteshSahu ทั้งคู่นำไปใช้กับ Hash Tables ( en.wikipedia.org/wiki/Hash_table ) นี่เป็นโครงสร้างข้อมูลที่ดีสำหรับการแสดงชุดมีประสิทธิภาพในวิธีที่ถูกต้องและที่สำคัญคือกุญแจของ HashMap ถูกนำมาใช้เป็น HashSet ดังนั้นใครก็ตามที่ตั้งชื่อพวกเขาก็มีปัญหาในการนำพวกเขาไปใช้และมุ่งเน้นไปที่การนำไปปฏิบัติมากกว่าจุดประสงค์ของพวกเขา
Carl Manaster

1
อธิบายได้ดี ขอบคุณ.
user3932000

5

การดำเนินการภายในHashset HashMapหากคุณเห็นการใช้งานภายในค่าที่แทรกใน HashSet จะถูกเก็บไว้เป็นคีย์ใน HashMap และค่าเป็นวัตถุจำลองของคลาสวัตถุ
ความแตกต่างระหว่าง HashMap กับ HashSet คือ: -

  1. HashMap มีคู่ของค่าคีย์และแต่ละค่าสามารถเข้าถึงได้โดยคีย์เนื่องจาก HashSet จำเป็นต้องทำซ้ำทุกครั้งเนื่องจากไม่มีเมธอด get
  2. HashMapใช้ Map interface และอนุญาตให้ค่า Null หนึ่งค่าเป็นคีย์และค่า Null หลายค่าเป็นเช่นนั้นHashSetดำเนินการตั้งค่าอินเตอร์เฟสอนุญาตค่า Null เพียงหนึ่งค่าและไม่มีค่าซ้ำกัน (อนุญาตให้ใช้หนึ่งคีย์ null ใน HashMap Remeber หนึ่งค่าคีย์ใน HashSet เป็น HashSet ดำเนิน HashMap ภายใน)
  3. HashSetและHashMapไม่รักษาลำดับของการแทรกในขณะที่วนซ้ำ

3

HashSet ช่วยให้เราสามารถจัดเก็บวัตถุในชุดที่เป็น HashMap ช่วยให้เราสามารถจัดเก็บวัตถุบนพื้นฐานของคีย์และค่า ทุกวัตถุหรือวัตถุที่เก็บไว้จะมีกุญแจ


2

ในฐานะที่เป็นชื่อบ่งบอกถึงการเป็นHashMap เป็นเชื่อมโยงแผนที่ (ทำแผนที่จากกุญแจสำคัญในการค่า) ซึ่งเป็นHashSetเป็นเพียงชุด


2
@SpikETidE นั่นเป็นรายละเอียดของวิธีการใช้งานที่ไม่ซ้ำกัน แต่ความหมายของ HashSet คือการใช้ชุด
Michael Borgwardt

1
ดังนั้น .. ทุกอย่างจะลดลงเหลือ "ถ้าคุณไม่ต้องการให้รายการที่ซ้ำกันใช้ hashSet ... ถ้าคุณไม่กังวลเกี่ยวกับรายการที่ซ้ำกันให้ใช้ HashMap" .... ?
SpikETidE

3
Java ไม่ได้ใช้คลาสเฉพาะสำหรับ "คอลเลกชันที่มีองค์ประกอบที่อาจซ้ำกัน" ("กระเป๋า") คุณสามารถใช้รายการสำหรับสิ่งนี้ (แม้ว่ารายการจะเพิ่มความหมายบางอย่างลงในกระเป๋า: สั่ง;
leonbloy

2

ความแตกต่างระหว่าง HashSet และ HashMap ใน Java

1)ความแตกต่างที่สำคัญที่สุดระหว่าง HashMap และ HashSet คือ HashMap เป็นการใช้งานแผนที่อินเตอร์เฟสในขณะที่ HashSet เป็นการดำเนินการของ Set interface ซึ่งหมายความว่า HashMap เป็นโครงสร้างข้อมูลตามค่าคีย์และ HashSet รับประกันเอกลักษณ์โดยไม่อนุญาตให้ซ้ำซ้อน ความเป็นจริง HashSet เป็น wrapper รอบ HashMap ใน Java ถ้าคุณดูที่รหัสของวิธีการเพิ่ม (E e) ของ HashSet.java คุณจะเห็นรหัสต่อไปนี้:

public boolean add(E e) 
{
    return map.put(e, PRESENT)==null;
}

โดยที่การวางวัตถุลงในแผนที่เป็นคีย์และค่าเป็นวัตถุสุดท้ายที่มีอยู่จำลอง

2)ความแตกต่างที่สองระหว่าง HashMap และ HashSet คือเราใช้วิธี add () เพื่อใส่องค์ประกอบเข้าไปใน Set แต่เราใช้วิธี put () เพื่อใส่คีย์และค่าลงใน HashMap ใน Java

3) HashSet อนุญาตให้ใช้เพียงปุ่มเดียวเท่านั้น แต่ HashMap สามารถอนุญาตให้ใช้ปุ่ม null หนึ่งปุ่ม + ค่า Null หลายค่า

นั่นคือความแตกต่างระหว่าง HashSet และ HashMap ใน Java โดยสรุป HashSet และ HashMap เป็นหนึ่งในคอลเลกชันที่แตกต่างกันสองประเภทที่ถูกตั้งค่าและอื่น ๆ ที่เป็นแผนที่


2

ความแตกต่างระหว่าง HashSet และ HashMap ใน Java

HashSet ใช้ HashMap ภายในเพื่อจัดเก็บวัตถุเมื่อเพิ่ม (String) วิธีการที่เรียกว่าวิธีการใส่ HahsMap (คีย์ค่า) วิธีการที่สำคัญ = วัตถุสตริงและค่า = วัตถุใหม่ (Dummy) ดังนั้นจึงไม่มีการทำซ้ำเพราะคีย์ไม่มีค่า วัตถุ.

วัตถุที่เก็บไว้เป็นกุญแจสำคัญใน Hashset / HashMap ควรแทนที่ hashcode & เท่ากับสัญญา

คีย์ที่ใช้ในการเข้าถึง / เก็บค่าวัตถุใน HashMap ควรประกาศเป็น Final เพราะเมื่อมีการแก้ไขวัตถุ Value ไม่สามารถหาตำแหน่งและคืนค่าว่าง


1

A HashMapคือการเพิ่มรับเอาออก ... วัตถุที่สร้างดัชนีโดยคีย์ที่กำหนดเองทุกประเภท
A HashSetคือการเพิ่มองค์ประกอบลบองค์ประกอบและตรวจสอบว่ามีองค์ประกอบโดยการเปรียบเทียบแฮชของพวกเขา

ดังนั้น HashMap จึงมีองค์ประกอบต่างๆและ HashSet จะจดจำแฮชของพวกเขา


1
โดยเปรียบเทียบแฮชของพวกเขาและเรียกequals()วิธีการของพวกเขา
มาร์ควิสแห่งลอร์น

1

ความแตกต่าง: เกี่ยวกับลำดับความสำคัญ: HashSet ใช้ Set HashMap ใช้แผนที่และจัดเก็บการทำแผนที่ของคีย์และค่า

การใช้ HashSet และ HashMap เกี่ยวกับฐานข้อมูลจะช่วยให้คุณเข้าใจความสำคัญของแต่ละรายการ
HashSet:โดยทั่วไปจะใช้สำหรับการจัดเก็บวัตถุการเก็บรวบรวมที่ไม่ซ้ำกัน เช่น: มันอาจใช้เป็นคลาสการใช้งานสำหรับการจัดเก็บความสัมพันธ์แบบหนึ่งต่อหนึ่งระหว่าง
รายการระดับและการเสนอราคาระดับที่ (รายการมีการเสนอราคาจำนวนมาก) HashMap:ใช้ในการแมปคีย์เพื่อค่าค่าอาจเป็นโมฆะหรือวัตถุใด ๆ / list of Object (ซึ่งเป็นวัตถุในตัวเอง)



0

HashSet ใช้ HashMap ภายในเพื่อจัดเก็บรายการ แต่ละรายการใน HashMap ภายในจะถูกคีย์โดยวัตถุเดียวดังนั้นรายการทั้งหมดแฮชเข้าไปในที่ฝากข้อมูลเดียวกัน ฉันไม่จำสิ่งที่ HashMap ภายในใช้เพื่อจัดเก็บค่าของมัน แต่มันไม่สำคัญเพราะคอนเทนเนอร์ภายในนั้นจะไม่มีค่าที่ซ้ำกัน

แก้ไข : เพื่อตอบความคิดเห็นของ Matthew เขาพูดถูก ฉันย้อนกลับไป HashMap ภายในเป็นคีย์กับวัตถุที่ทำขึ้นองค์ประกอบตั้ง ค่าของ HashMap เป็นวัตถุที่เพิ่งเก็บไว้ในที่เก็บ HashMap


ไม่ถูกต้อง องค์ประกอบการตั้งค่าจะใช้โดยตรงเป็นปุ่ม HashMap
Matthew Flaschen

0

HashMapเป็นการMapใช้งานช่วยให้ค่าที่ซ้ำกันแต่ไม่ได้คีย์ซ้ำ . สำหรับการเพิ่มวัตถุจำเป็นต้องใช้คู่ของคีย์ / ค่า อนุญาตให้ใช้ค่า Null Keys และ Null เช่น:

{ล้ำหน้าด้วย> 3 โลก> 5 ลล์> 2 Nice-> 4}

HashSetคือSetการดำเนินการที่ไม่ได้รับอนุญาตให้ซ้ำกันถ้าคุณพยายามที่จะเพิ่มวัตถุที่ซ้ำกันเรียกร้องให้วิธีการแล้วชุดยังคงไม่เปลี่ยนแปลงและผลตอบแทนpublic boolean add(Object o) falseเช่น:

[โลกเป็นดี]


-1

คุณตอบคำถามของคุณเองแล้ว - แฮชเซทไม่อนุญาตค่าที่ซ้ำกัน มันจะไม่สำคัญที่จะสร้าง hashset โดยใช้ hashmap สำรอง (และเพียงตรวจสอบเพื่อดูว่ามีค่าอยู่แล้ว) ฉันเดาว่าการใช้งานจาวาที่หลากหลายทำเช่นนั้นหรือใช้โค้ดที่กำหนดเองเพื่อให้มีประสิทธิภาพมากขึ้น


1
@oedo - บอกว่าจะมีการสนับสนุนจากjava.util.HashSet java.util.HashMap
justkt

2
การไม่อนุญาตให้ทำซ้ำไม่ได้เป็นความแตกต่าง
มาร์ควิสแห่ง Lorne

-1

โดยทั่วไปใน HashMap ผู้ใช้จะต้องให้ทั้งคีย์และค่าในขณะที่ใน HashSet ที่คุณให้เฉพาะค่าคีย์จะได้รับโดยอัตโนมัติจากค่าโดยใช้ฟังก์ชันแฮช ดังนั้นหลังจากมีทั้งคีย์และค่า HashSet สามารถเก็บเป็น HashMap ภายในได้


กุญแจสำคัญคือค่าใน HashSet
มาร์ควิสแห่งลอร์น

-1

HashSet และ HashMap ทั้งคู่เก็บความแตกต่างอยู่ใน HashMap คุณสามารถระบุคีย์ขณะที่ใน HashSet คีย์นั้นมาจากรหัสแฮชของวัตถุ


หากเป็นเช่นนั้นจริง HashSet จะไม่สามารถเก็บวัตถุจำนวนมากด้วย hashCode เดียวกันได้
มาร์ควิสแห่ง Lorne

-1

HashMapsอนุญาตหนึ่งคีย์ null และค่า null ไม่ได้ซิงโครไนซ์ซึ่งเพิ่มประสิทธิภาพ หากจำเป็นคุณสามารถทำให้ข้อมูลตรงกันได้โดยใช้Collections.SynchronizedMap()

Hashtables ไม่อนุญาตให้ใช้ปุ่ม null และทำให้ข้อมูลตรงกัน


เขาไม่ได้ถาม abut Hashtables ไม่ตอบคำถาม
มาร์ควิสแห่ง Lorne

-2

HashMap เป็นการใช้งานแผนที่อินเทอร์เฟซ HashSet เป็นการใช้งานของตั้งค่าอินเทอร์เฟซ

HashMap จัดเก็บข้อมูลในรูปแบบของคู่ค่าคีย์ HashSet Store เฉพาะวัตถุ

วิธีใส่ใช้เพื่อเพิ่มองค์ประกอบในแผนที่เพิ่มวิธีใช้เพื่อเพิ่มองค์ประกอบคือตั้งค่า

ในค่าแฮชโค้ดแฮชโค้ดจะถูกคำนวณโดยใช้วัตถุสำคัญที่นี่สมาชิกวัตถุจะใช้สำหรับการคำนวณค่าแฮชโค้ดซึ่งสามารถเหมือนกันสำหรับวัตถุสองรายการดังนั้นเมธอด equ () จะใช้ในการตรวจสอบความเท่าเทียมกันหากส่งคืนค่าเท็จ

HashMap เร็วกว่า hashset เนื่องจากมีการใช้คีย์เฉพาะเพื่อเข้าถึงวัตถุ HashSet ช้ากว่า Hashmap


1
พวกเขามีประสิทธิภาพเหมือนกันเป็นหลักและ 'เพราะใช้คีย์ที่ไม่ซ้ำกัน' ไม่ถูกต้อง
มาร์ควิสแห่ง Lorne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.