HashMap 的数据结构?
- 在JDK1.7里面,使用数组+链表的数据结构
- 在JDK1.8里面,使用数组+链表/红黑树的数据结构
在HashMap中,当两个key对象的 hashCode 相同会发生什么?
两个key的hashCode相同,则会发送hash碰撞
JDK8中对HashMap做了哪些改变?
- 在java 1.8中,如果链表的长度超过了8,那么链表将转换为红黑树。(桶的数量必须大于64,小于64的时候只会扩容)
- 发生hash碰撞时,java 1.7 会在链表的头部插入,而java 1.8会在链表的尾部插入
- 在扩容时,JDK1.7会使桶内链表的顺序颠倒,JDK1.8基本保持桶内键值对的顺序。
HashMap 和 HashTable 有什么区别?
- HashMap 是线程不安全的,HashTable 是线程安全的;
- 由于线程安全,所以 HashTable 的效率比不上 HashMap;
- HashMap最多只允许一条记录的键为null,允许多条记录的值为null,而 HashTable不允许;
- HashMap 默认初始化数组的大小为16,HashTable 为 11,前者扩容时,扩大两倍,后者扩大两倍+1;
- HashMap 需要重新计算 hash 值,而 HashTable 直接使用对象的 hashCode
hash冲突你还知道哪些解决办法?
比较出名的有四种(1)开放定址法(2)链地址法(3)再哈希法(4)公共溢出区域法