HashMap底层实现原理及面试问题
HashMap底层实现原理:哈希表可以说就是数组链表,底层还是数组但是这个数组每一项就是一个链表。
HashSet和HashMap有什么区别?
HashSet底层是采用HashMap实现的。HashSet 的实现比较简单,HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现的,因此 HashSet 和 HashMap 两个集合在实现本质上是相同的。,HashSet的add()方法是根据map的put返回值来判断添加元素是否成功的(也就是靠重写hashcode()和equals())。
HashMap为是什么要用链表和红黑树实现?在什么时候进行转化?
深入理解HashMap 的工作原理及代码实现,什么时候用到红黑树
HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,HashMap 使用拉链法(哈希函数)来解决hash冲突,同一个链表中存放哈希值相同的 Entry,链表的插入是以头插法方式进行的;HashMap 使用第 0 个桶存放键为 null 的键值对。
如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。
当发生哈希冲突并且size大于阈值的时候,需要进行数组扩容,扩容时,需要新建一个长度为之前数组2倍的新数组,然后将当前的Entry数组中的元素全部传输(复制)过去,扩容后的新数组长度为之前的2倍,所以扩容相对来说是个耗资源的操作。