优秀的散列函数
- 设计不能太复杂避免消耗计算时间
- 生成的值尽可能随机且均匀分布
装载因子过大?——动态扩容(阈值设置权衡时间空间复杂度)
避免低效扩容?
装载因子达阈值后,只申请新空间,将新数据插入新散列表,变更从旧散列表搬移一个数据到新散列表。
冲突解决方法选择?
开放寻址法(数据量小、装载因子<1适用)
- 优:利用CPU缓存加快查询速度、序列化较简单
- 缺:需特殊标记已删除数据、浪费内存空间
链表法(存储对象大、数据量大适用)
- 优:内存利用率高、对大装载因子容忍度高,支持更多优化策略:用红黑树代替链表
工业级的散列表要求&实现?
- 支持快速的查询、插入、删除操作(设计合适的散列函数)
- 内存占用合理(定义装载因子阈值,设计动态扩容策略)
- 性能稳定(选择合适的散列冲突解决方法)
LRU缓存淘汰算法
缓存(cache)系统操作:添加、删除、查找数据
【散列表(查找)+双向链表】(LinkedHashMap)
双向链表存储数据,结点=存储数据(data)+前驱指针(prev)+后继指针(next)+特殊字段(hnext将结点串在散列表的拉链中)