1. 说一下 HashSet 的实现原理?
HashSet 是基于HashMap 实现的,HashSet的值存放于 HashMap 的 key 上,HashMap 的 value 统一为 PRESENT,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。
2. HashSet 如何检查重复?HashSet 是如何保证数据不可重复的?
- 向 HashSet 中add()添加元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结合equals 方法比较。
- HashSet() 中的 add() 方法会使用 HashMap 的 put() 方法。
- HashMap的 key 是唯一的,由源码可以看出 HashSet 添加进去的值就是作为 HashMap 的key,并且在HashMap 中如果 K/V 相同时,会用新的V覆盖掉旧的V,然后返回旧的V。所以不会重复(HashMap 比较 key 是否相同时先比较 hashcode 再比较 equals)。
HashSet 部分源码:
private static final Object PRESENT = new Object();
private transient HashMap<E,Object> map;
public HashSet() {
map = new HashMap<>();
}
public boolean = add(E e) {
return map.put(e,PRESENT) == null;
}
3. hashcode() 与 equals() 的相关规定:
- 如果两个对象相等,则hashCode一定也是相同的
- 两个对象相等,对两个equals方法返回为true
- 两个对象有相同的hashCode值,它们也不一定是相等的
- 综上,equals方法被覆盖过,则hashCode方法也必须被覆盖
- hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该class 的对象无论如何都不会相等(即使这两个对象指向形同的数据)。
4. == 与 equals 的区别
- == 是判断两个变量或者实例是不是指向同一个内存空间 equals 是判断两个变量或者实例所指向的内存空间的值是不是相同。
- == 是指对内存地址进行比较 equals()是对字符串的内容进行比较。
- == 指引用是否相同 equals 指的的是值是否相同
5. HashSet 与 HashMap 的区别
HashMap | HashSet |
---|---|
实现了Map接口 | 实现了set接口 |
存储键值对 | 仅存储对象 |
调用put()向map 中添加元素 | 调用 add() 方法向set中添加元素 |
HashMap 使用键(Key)计算 HashCode | HashSet使用成员对象来计算 hashCode 值,对于两个对象来说 hashCode 可能相同,所以 equals() 方法用来判断对象的相等性,如果两个对象不同的话,那么返回false |
HashMap 相对于HashSet较快,因为它是使用唯一的键获取对象 | HashSet 较 HashMap来说比较慢 |
6. HashMap 的实现原理
- HashMap 概述:HashMap 是基于哈希值的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
- HashMap的数据结构:在Java编程语言中,最基本的结构就是两种,一个数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结合体。
6.1 HashMap 基于Hash 算法实现的
- 当我们往 HashMap 中 put 元素时,利用 key 的hashCode 重新 hash 计算出当前对象的元素在数组中的下标。
- 存储时,如果出现 hash 值相同的key,此时有两种情况:(1)如果 key 相同,则覆盖原始值。(2)如果 key 不同(出现冲突),则将当前的 key-value 放入链表中。
- 获取时,直接找到 hash 值对应的下标,再进一步判断 key 是否相同,从而找到对应值。
- 理解了以上过程不难明白 HashMap 的实现是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发生冲突就在链表中作进一步的对比。
- JDK1.8中对HashMap的实现做了优化,当链表中的节点数超过8个之后,该链表会转为红黑树来提高效率。