1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

Merge pull request #1282 from wulnm/master

增加HashSet新增元素方法的描述&typo
This commit is contained in:
Guide哥 2021-07-22 20:10:52 +08:00 committed by GitHub
commit dab63c3f97
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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` 一定也是相同的