HashMap基本概念
- 允许null value和null key
- 不保证所有key的遍历顺序
- 如果没有hash冲突,put和get操作的时间复杂度是O(1)
- 对HashMap遍历的时间复杂度是O(m + n),其中m是bucket个数,n是元素个数
- 装载因子(load factor) 用于判断HashMap何时扩容。元素个数n 大于等于capacity * load factor,则会扩容;从而保证bucket个数维持在元素个数的2倍左右。
- load factor默认值是0.75,调大可以节省空间,但是查询速度变慢;
- HashMap不是线程安全的
HashMap基本设计
- 默认采用拉链表,但是当一个链表中的节点数过多时,转换为树结构(类似于TreeMap中的结构,红黑树),以加快hash冲突情况下的查询速度。
- 只有当拉链表table的大小超过一定值时,才会开始创建红黑树。
- 红黑树中的节点按照hash code排序,如果hash code相同,看是否实现了相同的Comparable接口,如果实现了则根据Comparable接口判断顺序(这里尼玛用到了反射)
- 当红黑树中的节点数低于一定值,则退化回链表。
- bucket个数一定是2^n,因为:1)用2^n – 1与hash code进行位运算可直接找到bucket;2)每次扩容是把bucket个数扩大2倍,原来的hash code要么位置不变,要么往后移动2^(n-1)个位置。缺点:如果hash函数在生成