Hashmap、Hashtable和ConcurrentHashMap相关的问题

  1. 首先,他们的父类不同,hashmap的父类是AbstractMap,而hashtable是Dictionary,ConcurrentHashMap的父类也是AbstractMap。
  2. hashmap初始容量默认16,装载因子0.75,扩容默认为2n,hashtable初始容量默认11,装载因子0.75,扩容默认2n+1,如果hash冲突太多,可以通过降低装载因子。空间换时间来降低hash冲突。
  3. hashmap允许key为null,value为null,而hashtable中,既不能key为null,也不能value为null。
  4. hashmap是线程非安全的,而hashtable是线程安全的,因为他们的查询效率不同,hashmap要快很多。如果要使用线程安全的hashmap,可以使用concurrentHashMap,即使它加了锁,也比hashtable快,主要是因为他是分段锁。
  5. ConcurrentHashMap在1.8的实现中,当一个链表中的元素达到8个时,会调用treeifyBin()方法把链表结构转化成红黑树结构。
    二叉查找树
    1、要么为一颗空树,要么就是一颗具有如下特性的二叉树。
    2、左子节点的值必须小于等于父节点的值。
    3、右子节点的值必须大于等于父节点的值。
    --------->
    平衡二叉树
    1、要么为一颗空树,要么就是一颗具有如下特性的二叉树。
    2、它的左子树和右子树都是平衡二叉树。
    3、它的左子树和右子树的深度差的绝对值不超过1。
    --------->
    红黑树
    1、每个节点要么是黑色,要么是红色。
    2、根节点是黑色。
    3、所有叶子节点是黑色,即空节点(null)。
    4、如果一个节点是红色的,则它的两个子节点必须是黑色的,也就是父子节点不能都为红色。 5、从一个节点到其所有叶子节点的所有路径上包含相同数目的黑节点。
  6. 为什么不用平衡二叉树作为底层实现?
    那是因为平衡二叉是高度平衡的树, 而每一次对树的修改, 都要 rebalance, 这里的开销会比红黑树大. 如果插入一个node引起了树的不平衡,平衡二叉树和红黑树都是最多只需要2次旋转操作,即两者都是O(1);但是在删除node引起树的不平衡时,最坏情况下,平衡二叉树需要维护从被删node到root这条路径上所有node的平衡性,因此需要旋转的量级O(logN),而红黑树最多只需3次旋转,只需要O(1)的复杂度, 所以平衡二叉树需要rebalance的频率会更高,因此红黑树在大量插入和删除的场景下效率更高

你可能感兴趣的:(HashMap,HashTable,ConcurrentMap,面试)