zoukankan      html  css  js  c++  java
  • 一道HashMap面试题

    1、你看过那些源码吗?

    集合类

    2、那你能讲讲HashMap的实现原理吗?

    1.7 数组+链表;1.8 数组+链表+红黑树

    3、HashMap什么时候会进行rehash?

    当HashMap容量大于阈值时(阈值 = 初始数组长度+默认加载因子) 默认加载因子=0.75

    4、HashMap什么时候会进行扩容?

    扩容的两个条件:1.容量大于阈值2.产生了hash碰撞

    5、那HashMap的初始容量设置成多少比较合适呢?

    初始容量应该=(需要存储的元素个数/默认加载因子)+1,HashMap会选择大于该初始容量的第一个2的幂作为初始容量

    6、结合源码说说HashMap在高并发场景中为什么会出现死循环?

    https://blog.csdn.net/qq_36520235/article/details/86653136
    扩容后的rehash,多线程造成链表的回路.

    7、JDK1.8中对HashMap做了哪些性能优化?

    加入红黑树,当链表的长度大于8时,转换为红黑树的结构;

    8、HashMap和Hashtable有何不同?

    https://blog.csdn.net/wangxing233/article/details/79452946
    a.产生时间不同
    Hashtable在java一发布就提供了,而HashMap产生于java1.2;
    b.继承父类不同
    HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类;
    (相同:都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口)
    c.对null处理你不同
    Hashtable既不支持Null key也不支持Null value。
    HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null;
    d.线程安全不同
    Hashtable是线程安全的(操作都有synchronized实现),而HashMap线程不安全;
    e.初始容量大小和每次扩充容量大小的不同
    Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1;
    HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍;
    f.计算hash值的方法不同
    Hashtable直接使用对象的hashCode:
    java int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF)%table.length;
    HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取模预算时,不需要做除法,只需要做位运算;

    线程是否安全: HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!);
    效率: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点。另外,HashTable 基本被淘汰,不要在代码中使用它;
    对Null key 和Null value的支持: HashMap 中,null 可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为 null。。但是在 HashTable 中 put 进的键值只要有一个 null,直接抛出 NullPointerException。
    初始容量大小和每次扩充容量大小的不同 : ①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。②创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小(HashMap 中的tableSizeFor()方法保证,下面给出了源代码)。也就是说 HashMap 总是使用2的幂作为哈希表的大小,后面会介绍到为什么是2的幂次方。
    底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。

    9、HashMap 和 ConcurrentHashMap 的区别?

    https://www.cnblogs.com/ng-xixi/p/9942256.html
    HashMap线程不安全;
    ConcurrentHashMap线程安全(并不是绝对的线程安全),采用锁分段;(可重入锁)

    10、ConcurrentHashMap和LinkedHashMap有什么区别?

    https://www.cnblogs.com/ng-xixi/p/9942256.html

    11、为什么HashMap中的链表转红黑树的阀值是8?

    https://blog.csdn.net/sinat_41832255/article/details/88884586

    12、什么是ConcurrentSkipListMap?他和ConcurrentHashMap有什么区别?

    https://www.cnblogs.com/ygj0930/p/6543901.html

  • 相关阅读:
    git上传本地代码
    oracle 时间格式转化以及计算
    windows 下使用sqlplus
    filter 过滤器加载流程
    vscode java
    vscode cpp
    manual jar
    toy jar
    inteli shortcut
    eng
  • 原文地址:https://www.cnblogs.com/DiZhang/p/12544780.html
Copyright © 2011-2022 走看看