目录
- 一、HashMap基础:不只是键值对存储
- 二、底层数据结构演进
- JDK 1.8之前: 数组+链表
- JDK 1.8之后:数组+链表/红黑树
- 三、核心工作原理详解
- 1. put操作流程
- 哈希计算优化
- 3.扩容机制
- 四、面试高频问题深度解析
- Q1: HashMap的线程安全问题
- Q2:负载因子为什么是0.75?
- Q3:红黑树转换阈值为什么是8?
- 五、Android中HashMap优化实践
- 1. ArrayMap:内存优化的选择
- 2. SparseArray家族
- 3. 实际开发建议
- 六、面试实战技巧
- 七、总结与学习建议
在Android开发面试中,HashMap是绕不开的核心考点。本文将带你从底层原理到高级优化,全面掌握HashMap的面试要点。
一、HashMap基础:不只是键值对存储
HashMap是Java集合框架中的重要成员,也是Android开发中最常用的数据结构之一。它的基础特性包括:
- 基于哈希表的Map接口实现
- 存储键值对(Key-Value)映射
- 允许null键和null值
- 非线程安全
- 不保证元素顺序
// 基本使用示例HashMap<String,Integer>map=newHashMap<>();map.put("Android",11);map.put("Java",17);Integervalue=map.get("Android");// 返回11二、底层数据结构演进
JDK 1.8之前: 数组+链表
早期的HashMap采用经典的数组+链表结构:
- 数组: 存储Entry对象
- 链表:解决哈希冲突
// JDK 1.7中的Entry定义staticclassEntry<K,V>implementsMap.Entry<K,V>{finalKkey;Vvalue;Entry<K,V>next;// 链表指针inthash;}JDK 1.8之后:数组+链表/红黑树
JDK 1.8进行了重大优化,引入红黑树:
- 链表长度>8且数组容量≥64时,链表转为红黑树
- 红黑树节点≤6时,退化为链表
- 查询时间复杂度从O(n)优化为O(log n)
// JDK 1.8中的Node定义(链表节点)staticclassNode<K,V>implementsMap.Entry<K,V>{finalinthash;finalKkey;Vvalue;Node<K,V>next;}// TreeNode定义(红黑树节点)staticfinalclassTreeNode<K,V>extendsLinkedHashMap.Entry<K,