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遍历方法有几种?
- Iterator 迭代器
- 最常见的使用方式,可同时得到 key、value 值
- 使用 foreach 方式(JDK1.8 才有)
- 通过 key 的 set 集合遍历