「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战」。
1.HashMap和Hashtable的比较
HashMap:线程不安全的,key、value都可以为null,添加元素时,是使用自定义的哈希算法。
HashMap默认的容量大小是16;扩容时,每次将容量变为“原始容量x2”。
Hashtable:是线程安全的,key、value都不可以为null,添加元素时,直接采用的key的hashCode()。
Hashtable默认的容量大小是11;扩容时,每次将容量变为“原始容量x2 + 1”。 两者的遍历方式大同小异,Hashtable 仅仅比 HashMap 多一个 elements 方法。
2.HashMap和ConcurrentHashMap区别
HashMap:底层数组+链表实现,可以存储一个null键和多个null值,非线程安全 。
ConcurrentHashMap:底层采用分段的数组+链表实现,然后在每一个分段上都用 lock 锁进行保护,实现了只锁被修改的分段,其它分段还可以读和操作,并发性能更好,键值对不允许有 null,线程安全的。
3.HashMap 底层实现原理
当添加一个元素(key-value)时,就首先计算元素key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素,如果equals相同覆盖,否则添加到同一hash值的元素的后面,他们在数组的同一位置,形成了链表,同一各链表上的Hash值是相同的,所以说数组存放的是链表。而当链表长度太长时,链表就转换为红黑树,这样大大提高了查找的效率。
注:当发现链表中的元素个数大于8之后,还会判断一下当前数组的长度,如果数组长度小于64时,此时并不会转化为红黑树,而是进行扩容。只有当链表中的元素个数大于8,并且数组的长度大于(K的长度)等于64时才会将链表转为红黑树。)
4.HashMap和LinkedHashMap的区别?
HashMap:无序的,最多一个null键多个null值,HashMap不支持线程的同步
LinkedHashMap:记录的插入顺序,所以取出的的时候就是有序的,线程不安全
5.ArrayList/LinkedList /HashMap初始大小 ,扩容后多少?
ArrayList:初始化大小是 0,第一次使用时大小变为10,扩容因子默认1,扩容后的大小= 原始大小*1.5
LinkedList :是一个双向链表,没有初始化大小,也没有扩容的机制
HashMap:初始化大小是0,第一次使用时大小变为 16 ,扩容因子默认0.75,扩容后大小为 一倍