测试题16(答案解析)

1. 说一下 HashSet 的实现原理?

HashSet 是基于HashMap 实现的,HashSet的值存放于 HashMap 的 key 上,HashMap 的 value 统一为 PRESENT,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值