原文: https://beginnersbook.com/2014/08/hashset-vs-hashmap-java/

在本文中,我们将讨论HashSetHashMap类之间的差异。

HashSet vs HashMap

差异:

HashSet HashMap
HashSet类实现Set接口 HashMap类实现了Map接口
HashSet中,我们存储对象(元素或值),例如如果我们有一个字符串元素的HashSet,那么它可以描述一组HashSet元素:{"Hello", "Hi", "Bye", "Run"} HashMap用于存储键值对。简而言之,它保持了键和键的映射。(HashMap类大致相当于Hashtable,除了它是不同步的并且允许空值。)如果HashMap元素具有整数键和String类型的值,则可以表示HashMap元素:{1->"Hello", 2->"Hi", 3->"Bye", 4->"Run"}
HashSet不允许重复元素,这意味着您无法在HashSet中存储重复值。 HashMap不允许重复键,但它允许重复值。
HashSet允许具有单个空值。 HashMap允许单个null键和任意数量的空值。

相似之处:

1)HashMapHashSet都不同步,这意味着它们不适合线程安全操作unitl,除非明确同步。这是你可以明确地同步它们的方法:

HashSet

  1. Set s = Collections.synchronizedSet(new HashSet(...));

HashMap

  1. Map m = Collections.synchronizedMap(new HashMap(...));

2)这两个类都不保证其元素的顺序会随着时间的推移保持不变。

3)如果查看HashSet的源代码,您可能会发现它由HashMap备份。所以基本上它在内部使用HashMap进行所有操作。

4)它们都为基本操作提供恒定的时间性能,例如添加,删除元素等。

HashSet示例

  1. import java.util.HashSet;
  2. class HashSetDemo{
  3. public static void main(String[] args) {
  4. // Create a HashSet
  5. HashSet<String> hset = new HashSet<String>();
  6. //add elements to HashSet
  7. hset.add("AA");
  8. hset.add("BB");
  9. hset.add("CC");
  10. hset.add("DD");
  11. // Displaying HashSet elements
  12. System.out.println("HashSet contains: ");
  13. for(String temp : hset){
  14. System.out.println(temp);
  15. }
  16. }
  17. }

输出:

  1. HashSet contains:
  2. AA
  3. BB
  4. CC
  5. DD

HashMap示例

  1. import java.util.HashMap;
  2. class HashMapDemo{
  3. public static void main(String[] args) {
  4. // Create a HashMap
  5. HashMap<Integer, String> hmap = new HashMap<Integer, String>();
  6. //add elements to HashMap
  7. hmap.put(1, "AA");
  8. hmap.put(2, "BB");
  9. hmap.put(3, "CC");
  10. hmap.put(4, "DD");
  11. // Displaying HashMap elements
  12. System.out.println("HashMap contains: "+hmap);
  13. }
  14. }

输出:

  1. HashMap contains: {1=AA, 2=BB, 3=CC, 4=DD}

参考:

HashSet javadoc
HashMap javadoc