Java HashMap和HashSet的区别
HashSet是Set接口的一个实现,不允许有重复的值。最主要的是,存储在HashSet中的对象必须覆盖equals()方法来检查是否相等,以及hashCode()方法来保证没有重复的值被存储在我们的集合中。HashMap是Map接口的一个实现,它将一个键映射到值。在Map中不允许有重复的键。基本上,Map接口有两个实现类HashMap和TreeMap,主要区别在于TreeMap保持对象的顺序,而HashMap不会。HashSet和HashMap都是不同步的。
现在让我们以表格的方式来阐述HashMap和HashSet的区别,如下所示。
基本 | HashSet | HashMap |
---|---|---|
执行 | 集合接口 | Map接口 |
重复的 | 不允许 | 是的,允许重复的值,但不允许重复的键。 |
虚值 | 有 | 不允许 |
在添加操作中需要的对象 | 1 | 2 |
添加和存储机制 | HashMap对象 | 哈希技术 |
速度 | 相对来说,它比HashMap慢。 | 因为这里使用了散列技术,所以相对来说比HashSet快。 |
空值 | 有一个单一的空值 | 单个空键和任意数量的空值 |
插入方法 | 添加() | 放置() |
让我们在干净的java程序的帮助下,通过对内部工作的窥探来掌握理解。
例子1: HashSet
// Java program to demonstrate working of HashSet
// Importing HashSet class from java.util package
import java.util.HashSet;
// Mai class
public class GFG {
// Main driver method
public static void main(String[] args)
{
HashSet<String> hs = new HashSet<String>();
// Adding elements to the HashSet
hs.add("geeks");
hs.add("practice");
hs.add("contribute");
;
System.out.println(
"Before adding duplicate values \n\n" + hs);
// Addition of duplicate elements
hs.add("geeks");
hs.add("practice");
System.out.println(
"\nAfter adding duplicate values \n\n" + hs);
// Addition of null values
hs.add(null);
hs.add(null);
// Displaying HashSet elements
System.out.println("\nAfter adding null values \n\n"
+ hs);
}
}
输出
Before adding duplicate values
[practice, geeks, contribute]
After adding duplicate values
[practice, geeks, contribute]
After adding null values
[null, practice, geeks, contribute]
例2: HashMap
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args)
{
// This is how to declare HashMap
HashMap<Integer, String> hm = new HashMap<Integer, String>();
// Adding elements to HashMap*/
hm.put(12, "geeks");
hm.put(2, "practice");
hm.put(7, "contribute");
System.out.println("\nHashMap object output :\n\n" + hm);
// store data with duplicate key
hm.put(7, "geeks");
hm.put(12, "contribute");
System.out.println("\nAfter inserting duplicate key :\n\n" + hm);
}
}
输出
HashMap object output :
{2=practice, 7=contribute, 12=geeks}
After inserting duplicate key :
{2=practice, 7=geeks, 12=contribute}
在了解了以上两个输出的内部工作后,现在我们可以谈谈概念上的区别,具体如下。
- 实现: HashMap实现了Map接口,HashSet实现了Set接口。
- 重复: HashSet不允许有重复的值。HashMap存储键,值对,它不允许重复的键。如果键是重复的,那么旧的键会被新的值替换。
- 存储对象时的对象数量: HashMap需要两个对象put(K key, V Value)来向HashMap对象添加一个元素,而HashSet只需要一个对象add(Object o)
- 虚值: 在HashMap中没有虚值的概念,
HashSet内部使用HashMap来添加元素。在HashSet中, add(Object) 方法中传递的参数作为键K,Java内部为add(Object)方法中传递的每个值关联假值。 - 存储或添加机制: HashMap内部使用散列来存储或添加对象,HashSet内部使用HashMap对象来存储或添加对象。
- 速度: HashSet的速度比HashMap慢。
- 插入 HashMap使用put()方法来存储数据,而在HashSet中使用add()方法来添加或存储数据。
让我们用一个例子来总结一下
HashSet is a set, e.g. {1, 2, 3, 4, 5, 6, 7},
HashMap is a key -> value pair(key to value) map, e.g. {a -> 1, b -> 2, c -> 2, d -> 1}
这里,在HashMap的例子中,不能有重复的键,但它可能有重复的值。在HashSet中,必须没有重复的元素