meta|Java集合面试题看这篇就够了( 七 )


\t在拉链法中 , 如果hash冲突特别严重 , 则会导致数组上挂的链表长度过长 , 性能变差 , 因此在链表长度大于8时 , 将链表转化为红黑树 , 可以提高遍历链表的速度 。
22.HashMap多线程操作导致死循环问题知道吗?在jdk1.7之前 , 主要原因在于并发下的 Rehash 会造成元素之间会形成一个循环链表 。 不过 , jdk 1.8 后解决了这个问题 , 但是还是不建议在多线程下使用 HashMap因为多线程下使用 HashMap 还是会存在其他问题比如数据丢失 。 并发环境下推荐使用 ConcurrentHashMap。
23.说说LinkedHashMap 的实现原理?HashMap
accessOrder

24.说说HashMap 和 HashSet 区别?HashSet 底层就是基于 HashMap 实现的 。 两者主要区别:

\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
HashMapHashSet
实现了 Map 接口实现了 set 接口
存储键值对存储对象
key 唯一 , value不唯一存储对象唯一
HashMap使用键(Key )计算HashcodeHashSet 使用成员对象来计算 hashcode 值 , 对于两个对象来说 hashcode 可能相同 , 所以equals()方法用来判断对象的相等性
速度相对较快速度相对较慢
25.说下HashMap 和 Hashtable 的区别?
  1. 线程是否安全: HashMap 是非线程安全的 ,Hashtable 是线程安全的因为 Hashtable 内部的方法基本都经过 synchronized 修饰 。 (如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!)
  2. **效率:**因为Hashtable加了 synchronized 锁 。 所以HashMap 要比 Hashtable 效率高一点 。 另外 , Hashtable 基本被淘汰 , 不要在代码中使用它

  3. 对 Null key 和 Null value 的支持: HashMap 可以存储 null 的 key 和 value , 但 null 作为键只能有一个 , null 作为值可以有多个; Hashtable 不允许有 null 键和 null 值 , 否则会抛出 NullPointerException  。

  4. 初始容量大小和每次扩充容量大小的不同 :

  5. ① 创建时如果不指定容量初始值 , Hashtable 默认的初始大小为 11  , 之后每次扩充 , 容量变为原来的 2n+1  。 HashMap 默认的初始化大小为 16  。 之后每次扩充 , 容量变为原来的 2倍 。

  6. ② 创建时如果给定了容量初始值 , 那么 Hashtable 会直接使用你给定的大小 , 而 HashMap 会将其扩充为 2 的幂次方大小 。 也就是说 HashMap 总是使用 2 的幂作为哈希表的大小 。
  7. 底层数据结构:JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化 , 当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断 , 如果当前数组的长度小于 64 , 那么会选择先进行数组扩容 , 而不是转换为红黑树)时 , 将链表转化为红黑树 , 以减少搜索时间 。 Hashtable 没有这样的机制 。

26.说一下HashMap 和 TreeMap 区别?TreeMap 和 HashMap 都继承自 AbstractMap  , 但是需要注意的是 TreeMap 它还实现了 NavigableMap 接口和 SortedMap 接口 。