
HashMap
装兔子的猫
这个作者很懒,什么都没留下…
展开
-
【面试题】说说HashMap是如何进行扩容的?
HashMap扩容:两倍扩容,底层为数组,当数组满了之后,会自动扩容。 扩容:扩大数组长度,对原数组进行rehash操作,把原数组copy到新数组中 问题:假设16数组中[<>]同一个位置存放了多对key-value,当扩容为32位时,其中某对或多对key-value发生了位置的变动。 扩容后,要进行rehash重新将hash值与n-1进行与运算。如下 数组长度=16 n-1 0000 0000 0000 0000 0000 0000 0000 1111 hash1 1111 111原创 2020-12-05 15:07:27 · 6411 阅读 · 0 评论 -
【面试题】HashMap如何解决hash碰撞的问题?
hash冲突问题解决方案:链表O(n)+红黑树O(logn) 正常一个位置放一对key-value,冲突后存放两对或多对key-value [<>]数组中这个位置会挂一个链表。 上面为本问题最简单的回答。 继续问:这种挂链表的方式假设链表很长,会导致便利链表性能较差,达到时间复杂度O(n) 做了个优化: 如果链表长度达到一定长度后,链表会转化为红黑树。使用红黑树的好处是,当遍历红黑树的时候,时间复杂度变为O(logn),性能较高 要答出两点: (1)出现hash冲突的时候,会在这原创 2020-12-05 15:05:11 · 2550 阅读 · 1 评论 -
【面试题】JDK1.8中对hash算法和寻址算法是如何优化的?
hash算法优化 JDK1.8中源码如下: static final int hash(Object key){ int h; return (key == null)?0:(h == key.hashCode())^(h>>>16); } hashcodeyou右移16位并做异或操作 异或:相同为0,不同为1 假设有哦个key的hash值如下 【原hash值】1111 1111 1111 1111 1111 1010 0111 1100 【右移1...原创 2020-12-05 15:02:46 · 461 阅读 · 0 评论