📅  最后修改于: 2023-12-03 15:01:49.771000             🧑  作者: Mango
Set是Java中的一个接口,用于表示一组不重复的元素,具有去重的功能。HashSet是Set接口的一个实现类,是基于哈希表实现的。本文将介绍HashSet的内部工作原理。
HashSet内部是基于哈希表实现的,它使用了一个哈希函数来计算元素在哈希表中的位置。哈希表中存储的元素是键值对,其中键是元素的哈希值,值是元素本身。
HashSet的实现保证了元素的插入、删除、查找的时间复杂度均为O(1)。这是因为哈希表使用了一个数组来存储元素,同时使用链表或红黑树解决哈希冲突。
在Java中,HashSet使用了如下的数据结构:
transient HashMap<E,Object> map;
其中,HashMap是Java中实现哈希表的类。而Object是一个占位符,因为HashMap中的键值对只需要键,不需要值。因此,在HashSet中,所有元素其实都是HashMap的键,而对应的value值都是Object占位符。
当插入一个元素时,HashSet会调用元素的hashCode()方法来获得元素的哈希值,然后使用哈希函数计算元素在哈希表中的位置。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
上面的代码就是HashSet中add()方法的实现。可以看到,调用Map的put()方法来添加元素。因为put()方法会将新元素对应的键值对添加到哈希表中,如果新元素不存在,那么返回null;否则,返回旧元素对应的value。
由于HashSet只需要值,而不需要键值对,因此将Object作为所有元素的value。
当删除一个元素时,HashSet会调用元素的hashCode()方法来获得元素的哈希值,然后使用哈希函数计算元素在哈希表中的位置。查找哈希表中对应的元素,将其删除即可。
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
上面的代码就是HashSet中remove()方法的实现。可以看到,调用Map的remove()方法来删除元素。如果元素存在,那么返回PRESET占位符;否则,返回null。
当查找一个元素时,HashSet会调用元素的hashCode()方法来获得元素的哈希值,然后使用哈希函数计算元素在哈希表中的位置。查找哈希表中对应的元素即可。
public boolean contains(Object o) {
return map.containsKey(o);
}
上面的代码就是HashSet中contains()方法的实现。可以看到,调用Map的containsKey()方法来查找元素。如果元素存在,那么返回true;否则,返回false。
HashSet是Java中实现Set接口的一个类,它基于哈希表实现,使用了HashMap来存储元素。HashSet的内部工作原理非常简单,就是基于哈希表实现的。它通过哈希函数计算元素在哈希表中的位置,可以实现高效的插入、删除、查找操作。