Set常见知识点
# Set常见知识点
# HashSet 如何检查重复
当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()
方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让加入操作成功。
在 openjdk8 中,HashSet 的 add()
方法只是简单的调用了 HashMap 的 put()
方法,并且判断了一下返回值以确保是否有重复元素。直接看一下 HashSet 中的源码:
// Returns: true if this set did not already contain the specified element
// 返回值:当set中没有包含add的元素时返回真
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
1
2
3
4
5
2
3
4
5
而在 HashMap 的 putVal()
方法中也能看到如下说明:
// Returns : previous value, or null if none
// 返回值:如果插入位置没有元素返回null,否则返回上一个元素
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {
...
}
1
2
3
4
5
2
3
4
5
也就是说,在 openjdk8 中,实际上无论 HashSet 中是否已经存在了某元素,HashSet 都会直接插入,只是会在 add()
方法的返回值处告诉我们插入前是否存在相同元素。
编辑 (opens new window)
上次更新: 2023/08/20, 21:21:52