1. HashMap 和 Hashtable 有什么区别?
存储:HashMap 允许 key 和 value 为 null,而 Hashtable 不允许。
线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。
推荐使用:在
2. 如何决定使用HashMap还是TreeMap?
对于在Map中插入、删除、定位一个元素这类操作,HashMap 是最好的选择,因为相对而言 HashMap 的插入会更快,但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择。
3. 说一下HashMap的实现原理?
HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket(桶)里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。Java1.8对HashMap做了改进,在链表长度大于8的时候,将后面的数据存在红黑树中,以加快检索速度。后续如果由于删除或者其他原因调整了大小,当红黑树的节点小于或等于
4. 为什么1.8后hashMap要用链表 红黑树的组合呢?
当这个链表过长了,查找这个链表上的元素的时候自然会变慢,所以链表如果过长了会影响到HashMap的性能。
所以在java1.8中,当链表过长时,会将该链表自动转为红黑树,红黑树是一个自平衡二叉树,能够优化查找的性能。
5. 在hashMap中链表什么情况下才会变成红黑树?
把链表转为红黑树、还是选择扩容,看这几个阀值:
①,当链表的长度 大于8,并且entry数组的长度大于64时,才会将链表转为红黑树。
②,当链表的长度小于 6,但是entry数组的长度小于64时,不转为红黑树,而是调用resize方法进行扩容;