java题

作者: 新生代民工代表 | 来源:发表于2022-02-15 17:40 被阅读0次
    image.png
    • hashSet底层实现?

    hashSet底层实现用的hashMap,存入的值都在key里面,value存放的是一个固定值

    // Dummy value to associate with an Object in the backing Map
       private static final Object PRESENT = new Object();
    

    • 为什么内置HashMap

    hashMap是基于数组和链表的数据结构,是考虑时间和空间的的因素后比较优秀的一种实现,能重用为啥要单独自己搞


    • 说下HashMap的数据结构

    数组加链表+红黑树


    • 为什么loalFactor是0.75

    太高了增加时间成本,比如1,说明会产生很多碰撞,链表已经很长了;太低,空间利用率不够;
    另外这个值是坐着根据泊松分布计算后综合考虑的,泊松分布是离散随机分布的一种,通常被使用在估算在 一段特定时间/空间内发生成功事件的数量的概率。
    设置成0.75有一个好处,那就是0.75正好是3/4,而capacity又是2的幂。所以,两个数的乘积都是整数。


    • 为什么要高位参与运算

    增加 hash 值的任意性;

    1. 高位运算的步骤:是无符号右移16位,低位挤走,高位补0,高位参与运算,这样算出来的结果实质是高区与低区的二进制特征混合到低区;
    2. 假设数组槽的大小是16,(n - 1) = 15那么他的二进制是 0000 0000 0000 0000 0000 0000 0000 1111;
    3. 那么计算该hashCode属于哪个槽位是用的代码 (n - 1) & hash;由于这个 (n - 1)的高位都是0,所以和hash的高位&的时候,hashCode的高位有细微变化是体现不出来的,因为和0 &运算的结果都是0;
    4. 所以这种情况很容易产生冲突,所以高位参与地位运算的精髓就是,让高位的细微变动能导致不同的结果,这样hash的结果更加均匀

    • 为什么高位参加运算的时候使用的是异或^,而不是与&

    (^ 为按位异或,即转成二进制后,相异为1,相同为0);异或运算能更好的保留各部分的特征,如果采用 & 运算计算出来的值会向 1 靠拢,采用 | 运算计算出来的值会向 0 靠拢;因为右移了16,高位是0,&之后还是0,那右移了个寂寞


    • ConcurrentHashMap的get方法有锁么

    只有在get方法,如果此时结构是红黑树,这个时候在进行树查找时会判断这个树是否在变色,会进行读写锁的判断


    • ConcurrentHashMap的get是强一致性么?为什么是弱一致性

    不是,虽然Node的数组table被volatile修饰,但是这样只是代表table的引用地址如果被修改,其他线程可以立马看到,并不代表table里的数据被修改立马可以看到。


    • happens-before 是什么?

    前一个操作的结果可以被后续的操作获取。讲白点就是前面一个操作把变量a赋值为1,那后面一个操作肯定能知道a已经变成了1。


    相关文章

      网友评论

          本文标题:java题

          本文链接:https://www.haomeiwen.com/subject/xrcllrtx.html