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)查找。
标签:链表,HashMap,HashSet,TreeMap,学习,深入,key,null From: https://blog.51cto.com/u_16190226/6911191