1.HashMap和HashTable的区别?

a.HashMap是线程不安全的,HashTable 是线程安全的。

b.HashTable不允许有null键和null值。

c.HashMap底层是数组+链表+红黑树,而HashTable底层是数组+链表。

d.HashMap默认的初始大小为16,每次扩容变为原来的2倍;HashTable默认初始大小为11,每次扩容后容量变为原来的2n+1。

2.HashMap和TreeMap的区别?

a.HahsMap是基于哈希表,而TreeMap是基于红黑树的;

b.HashMap的key可以是null,而TreeMap的key不能为null;

c.HashMap的key-value对是无序的,而TreeMap的key-value对是有序的。

d.HashMap的查找速度更快,而Treemap的查找速度更慢。

e.hashMap的实现比TreeMap更简单。

3.HashMap和HashSet的区别?

a.存储方式:HashMap是一个映射表,它存储的是键值对,而HashSet是一个集合,它存储的是单个的值。

b.元素的唯一性:HashMap中的key是唯一的,而value可以重复;而HashSet中的元素是唯一的,不能重复。

c.对null的支持:HashMap可以存储一个null键和多个null值,而HashSet最多存储一个null值。

d.底层数据结构:HashMap是基于哈希表实现的,而HashSet是基于HashMap实现的,底层也是使用哈希表。

e.使用场景:HashMap适用于需要通过键值对来查找元素的场景,而HashSet适用于需要存储唯一元素的场景。

4.为什么HashMap的默认负载因子是0.75?

a.因为阈值 = 负载因子 * 容量,为了保证阈值始终为整数,2的次幂乘以0.75始终为整数。

b.负载因子太小会导致频繁扩容,负载因子太大会导致Hash冲突的概率增大。

5.HashMap的put/get过程?

一、put的过程

a.对key的hashCode()做hash运算,计算index;

b.如果没有碰撞直接放到bucket里;

c.如果碰撞了,以链表的形式存在buckets后;

d.如果碰撞导致链表过长,就把链表转换成红黑树。

e.如果节点已经存在就替换old value。

f.如果bucket满了,就要resize。

二、get的过程

a.对key的hashCode做hash运算,计算index;

b.如果在bucket里的第一个节点里直接命中,则直接返回;

3.如果有冲突,则通过key.equals(k)去查找对应的Entry;

4.若为树,则在树中通过key.equals(k)查找;

5.若为链表,则在链表中通过key.equals(k)查找。

6.为什么要使用红黑树?

使用红黑树的时候查询会更快一些。