Skip to content

Commit dab63c3

Browse files
authored
Merge pull request Snailclimb#1282 from wulnm/master
增加HashSet新增元素方法的描述&typo
2 parents 9573e36 + 473d720 commit dab63c3

File tree

1 file changed

+22
-1
lines changed

1 file changed

+22
-1
lines changed

docs/java/collection/Java集合框架常见面试题.md

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,10 +432,31 @@ TreeMap<Person, String> treeMap = new TreeMap<>((person1, person2) -> {
432432

433433
### 1.4.4. HashSet 如何检查重复
434434

435-
以下内容摘自我的 Java 启蒙书《Head fist java》第二版:
435+
以下内容摘自我的 Java 启蒙书《Head first java》第二版:
436436

437437
当你把对象加入`HashSet`时,`HashSet` 会先计算对象的`hashcode`值来判断对象加入的位置,同时也会与其他加入的对象的 `hashcode` 值作比较,如果没有相符的 `hashcode``HashSet` 会假设对象没有重复出现。但是如果发现有相同 `hashcode` 值的对象,这时会调用`equals()`方法来检查 `hashcode` 相等的对象是否真的相同。如果两者相同,`HashSet` 就不会让加入操作成功。
438438

439+
在openjdk8中,`HashSet``add()`方法只是简单的调用了`HashMap``put()`方法,并且判断了一下返回值以确保是否有重复元素。直接看一下`HashSet`中的源码:
440+
```java
441+
// Returns: true if this set did not already contain the specified element
442+
// 返回值:当set中没有包含add的元素时返回真
443+
public boolean add(E e) {
444+
return map.put(e, PRESENT)==null;
445+
}
446+
```
447+
448+
而在`HashMap``putVal()`方法中也能看到如下说明:
449+
```java
450+
// Returns : previous value, or null if none
451+
// 返回值:如果插入位置没有元素返回null,否则返回上一个元素
452+
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
453+
boolean evict) {
454+
...
455+
}
456+
```
457+
458+
也就是说,在openjdk8中,实际上无论`HashSet`中是否已经存在了某元素,`HashSet`都会直接插入,只是会在`add()`方法的返回值处告诉我们插入前是否存在相同元素。
459+
439460
**`hashCode()``equals()` 的相关规定:**
440461

441462
1. 如果两个对象相等,则 `hashcode` 一定也是相同的

0 commit comments

Comments
 (0)