mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
commit
dab63c3f97
@ -432,10 +432,31 @@ TreeMap<Person, String> treeMap = new TreeMap<>((person1, person2) -> {
|
|||||||
|
|
||||||
### 1.4.4. HashSet 如何检查重复
|
### 1.4.4. HashSet 如何检查重复
|
||||||
|
|
||||||
以下内容摘自我的 Java 启蒙书《Head fist java》第二版:
|
以下内容摘自我的 Java 启蒙书《Head first java》第二版:
|
||||||
|
|
||||||
当你把对象加入`HashSet`时,`HashSet` 会先计算对象的`hashcode`值来判断对象加入的位置,同时也会与其他加入的对象的 `hashcode` 值作比较,如果没有相符的 `hashcode`,`HashSet` 会假设对象没有重复出现。但是如果发现有相同 `hashcode` 值的对象,这时会调用`equals()`方法来检查 `hashcode` 相等的对象是否真的相同。如果两者相同,`HashSet` 就不会让加入操作成功。
|
当你把对象加入`HashSet`时,`HashSet` 会先计算对象的`hashcode`值来判断对象加入的位置,同时也会与其他加入的对象的 `hashcode` 值作比较,如果没有相符的 `hashcode`,`HashSet` 会假设对象没有重复出现。但是如果发现有相同 `hashcode` 值的对象,这时会调用`equals()`方法来检查 `hashcode` 相等的对象是否真的相同。如果两者相同,`HashSet` 就不会让加入操作成功。
|
||||||
|
|
||||||
|
在openjdk8中,`HashSet`的`add()`方法只是简单的调用了`HashMap`的`put()`方法,并且判断了一下返回值以确保是否有重复元素。直接看一下`HashSet`中的源码:
|
||||||
|
```java
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
而在`HashMap`的`putVal()`方法中也能看到如下说明:
|
||||||
|
```java
|
||||||
|
// Returns : previous value, or null if none
|
||||||
|
// 返回值:如果插入位置没有元素返回null,否则返回上一个元素
|
||||||
|
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
|
||||||
|
boolean evict) {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
也就是说,在openjdk8中,实际上无论`HashSet`中是否已经存在了某元素,`HashSet`都会直接插入,只是会在`add()`方法的返回值处告诉我们插入前是否存在相同元素。
|
||||||
|
|
||||||
**`hashCode()`与 `equals()` 的相关规定:**
|
**`hashCode()`与 `equals()` 的相关规定:**
|
||||||
|
|
||||||
1. 如果两个对象相等,则 `hashcode` 一定也是相同的
|
1. 如果两个对象相等,则 `hashcode` 一定也是相同的
|
||||||
|
Loading…
x
Reference in New Issue
Block a user