大家好,我是鸭鸭!
此答案节选自鸭鸭最近弄的面试刷题神器,更多大厂常问面试题,可以点击进行阅读哈!
目前这个面试刷题小程序刚出,网页和小程序双端可以阅读!
回归面试题!
回答重点
1)合理设置初始容量:
如果在使用时可以预估 HashMap 存储的数据量大小,那么需要在创建时设置一个合适的初始容量,以避免频繁的扩容操作。
Java 中 HashMap 默认初始容量是 16。
2)调整负载因子:
官方提供的默认负载因子是 0.75。
可以根据具体应用场景调整这个值。较低的负载因子会减少冲突,提高查找效率,但会占用更多内存。较高的负载因子则会减少内存消耗,但可能增加冲突的概率,降低查找效率。
3)确保 hashCode 均匀分布:
对应 key 的 hashCode() 方法生成的哈希值需均匀分布,减少哈希冲突。避免使用质量不高的哈希函数,防止大量键映射到相同的槽位上,造成性能瓶颈。
扩展
HashMap 扩容机制的性能影响
扩容触发条件:
当 HashMap 中的元素数量超过容量 × 负载因子
时,会触发扩容。扩容会将容量扩展为当前容量的两倍,并将所有键值对重新分配到新的桶(bucket)中。
性能影响:
扩容是一个耗时的操作,因为它需要重新计算每个键的哈希值,并将键值对重新分配到新的桶中。因此,频繁的扩容会显著影响性能,特别是在存储大量数据时。
其他优化
例如需要保留元素的插入顺序,则可以使用 LinkedHashMap
替换 HashMap
。它基于 HashMap
但维护了一个链表,记录元素的插入顺序。
这样就不需要我们从 HashMap
中获取数据,然后再排序。
如果是需要保留有序的键值对,则可以使用 TreeMap
。
如果是线程安全场景,则可以使用 ConcurrentHashMap
。
最后
最后再推荐下鸭鸭目前努力在做面试刷题神器,已经有近 5000 多道面试题目啦,欢迎大家来阅读!如果大家有不会的面试题,也可以在面试鸭内反馈!鸭鸭会第一时间为大家解答!
我是鸭鸭,我们下期见~