📜  Java中SetHashSet的内部工作(1)

📅  最后修改于: 2023-12-03 15:01:49.771000             🧑  作者: Mango

Java中Set和HashSet的内部工作

Set是Java中的一个接口,用于表示一组不重复的元素,具有去重的功能。HashSet是Set接口的一个实现类,是基于哈希表实现的。本文将介绍HashSet的内部工作原理。

1. HashSet的基本概念

HashSet内部是基于哈希表实现的,它使用了一个哈希函数来计算元素在哈希表中的位置。哈希表中存储的元素是键值对,其中键是元素的哈希值,值是元素本身。

HashSet的实现保证了元素的插入、删除、查找的时间复杂度均为O(1)。这是因为哈希表使用了一个数组来存储元素,同时使用链表或红黑树解决哈希冲突。

2. HashSet的内部数据结构

在Java中,HashSet使用了如下的数据结构:

transient HashMap<E,Object> map;

其中,HashMap是Java中实现哈希表的类。而Object是一个占位符,因为HashMap中的键值对只需要键,不需要值。因此,在HashSet中,所有元素其实都是HashMap的键,而对应的value值都是Object占位符。

3. HashSet的插入

当插入一个元素时,HashSet会调用元素的hashCode()方法来获得元素的哈希值,然后使用哈希函数计算元素在哈希表中的位置。

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

上面的代码就是HashSet中add()方法的实现。可以看到,调用Map的put()方法来添加元素。因为put()方法会将新元素对应的键值对添加到哈希表中,如果新元素不存在,那么返回null;否则,返回旧元素对应的value。

由于HashSet只需要值,而不需要键值对,因此将Object作为所有元素的value。

4. HashSet的删除

当删除一个元素时,HashSet会调用元素的hashCode()方法来获得元素的哈希值,然后使用哈希函数计算元素在哈希表中的位置。查找哈希表中对应的元素,将其删除即可。

public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}

上面的代码就是HashSet中remove()方法的实现。可以看到,调用Map的remove()方法来删除元素。如果元素存在,那么返回PRESET占位符;否则,返回null。

5. HashSet的查找

当查找一个元素时,HashSet会调用元素的hashCode()方法来获得元素的哈希值,然后使用哈希函数计算元素在哈希表中的位置。查找哈希表中对应的元素即可。

public boolean contains(Object o) {
    return map.containsKey(o);
}

上面的代码就是HashSet中contains()方法的实现。可以看到,调用Map的containsKey()方法来查找元素。如果元素存在,那么返回true;否则,返回false。

6. 总结

HashSet是Java中实现Set接口的一个类,它基于哈希表实现,使用了HashMap来存储元素。HashSet的内部工作原理非常简单,就是基于哈希表实现的。它通过哈希函数计算元素在哈希表中的位置,可以实现高效的插入、删除、查找操作。