Map在Java里边是一个接口,常见的实现类有HashMap,LinkedHashMap,TreeMap和ConcurrentHashMap
在Java里边,哈希表的实现是由数组+链表组成
HashMap底层数据结构是数组+链表/红黑树
LinkedHashMap底层数据结构是数组+链表+双向链表
TreeMap底层数据结构是红黑树
ConcurrentHashMap底层数据结构也是数组+链表/红黑树
Q&A
1、你能讲讲new一个HashMap的时候,会发生什么吗?
如果我们不指定大小,默认HashMap的大小是16,负载银子的大小是0.75
还有就是:HashMap的大小只能是2次幂的(tableSizeFor方法去判断,不是2次幂强行变为2次幂)
我们把原素放进HashMap的时候,需要算出这个元素所在的位置(hash值)
在HashMap里用的是位运算来取代取模,能够更加高效的算出元素所在位置
而负载因子的大小决定着哈希表的扩容和哈希冲突
比如现在我默认的HashMap大小是16,负债因子是0.75,那么16*0.75=12,这意味着这个数组最多只能存放12个元素,一旦超过12个元素,那么这个哈希表就要扩容了
由于HashMap的大小只能是2次幂,所以HashMap扩容机制为2倍扩容
2、为什么HashMap的大小只能是2次幂?
因为只有大小为2次幂时,才能合理用位运算代替取模
3、扩容这个肯定是耗时的操作,那能不能把负载因子调高一点,比如调到1,那么我的HashMap就等到存放16个元素的时候才开始扩容呢
面经-Map
最新推荐文章于 2024-07-14 16:24:46 发布