Java数据结构——HashMap、ConcurrentHashMap

HashMap的31个问题
在这里插入图片描述
在这里插入图片描述

0:HashSet基于HashMap实现的,它的value为常量Object()类对象,而不是NULL

set的add方法
public boolean add(E e) {
   
        return map.put(e, PRESENT)==null;
    }
2.常量Object()类对象
private static final Object PRESENT = new Object();

1:说说HashMap 底层数据结构是怎样的?

jdk8前:HashMap 底层是 hash 数组和单向链表实现;
jdk8后:采用hash数组+链表+红黑树的数据结构。

2:谈一下HashMap的特性?

我们通过put和get存储和获取对象。

  • 当我们给put()方法传递键和值时:先对键做一个hashCode()的计算,来得到它在bucket数组中的位置来存储Entry对象。
  • 当获取对象时,通过get获取到bucket的位置,再通过键对象的equals()方法找到正确的键值对,然后在返回值对象。

3:使用HashMap时,当两个对象的 hashCode 相同怎么办?

"哈希碰撞"就此发生。又因为 HashMap 使用链表存储对象,这个 Node 会存储到链表中。

  • JDK8之后,Node插入链表尾部;
  • JDK8之前,插入链表头部;

4:HashMap 的哈希函数怎么设计的吗?

hash 函数是先拿到通过 key 的 hashCode ,是 32 位的 int 值,然后让 hashCode 的高 16 位和低 16 位进行异或操作。两个好处:

  • 一定要尽可能降低 hash 碰撞,越分散越好;
  • 算法一定要尽可能高效,因为这是高频操作, 因此采用位运算;

5:HashMap遍历方法有几种?

HashMap的3种遍历方式

  • Iterator 迭代器
  • 最常见的使用方式,可同时得到 key、value 值
  • 使用 foreach 方式(JDK1.8 才有)
  • 通过 key 的 set 集合遍历

6:为什么采用 hashcode 的高 16 位和低 16 位异或能降低 hash 碰撞

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值