hashmap

1.hashmap 为什么内置数组长度一定是2的指数次幂?

计算key值的hashcode后,转为数组index时,用的位与运算(为了提高速度)

hashcode & (arr.length-1)

0000000000011111111111111111

length时2的n次方,才能保证&计算后,一定不越界。

2.并发扩容,死锁 (java7存在,因为是头插法,java8链表用尾插法解决)

并发扩容,数据丢失

3.为什么hashmap扩容因子是0.75

0.75一个空间换时间的考虑

4.为什么转红黑树是临界值是>8,红黑树转链表是<=6

红黑树的平均查找长度是log(n),长度为8,查找长度为log(8)=3,链表的平均查找长度为n/2,当长度为8时,平均查找长度为8/2=4,这才有转换成树的必要;链表长度如果是小于等于6,6/2=3,虽然速度也很快的,但是转化为树结构和生成树的时间并不会太短。

5.扩容时,链表最长时会是几?

                for (int binCount = 0; ; ++binCount) {
                    if ((e = p.next) == null) {
                        p.next = newNode(hash, key, value, null);
                        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                            treeifyBin(tab, hash);
                        break;
                    }

链表插入第9个时,重构为红黑树 

对外表现不会大于9,中间会是9

    final void treeifyBin(Node[] tab, int hash) {
        int n, index; Node e;
        if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)
            resize();

 

你可能感兴趣的:(数据结构与算法,java集合框架)