1整体架构
HashMap底层的数据结构主要是:数组+链表+红黑树。其中当链表的长度大于等于八时,链表会转化为红黑树,当红黑树的大小小于等于6时,红黑树会转化成链表。
1.1类注释
从HashMap的类注释中,我们可以得到如下信息:
允许nll值,不同于HashTable,是线程不安全的;
影响因子默认值是0.75,不扩容的条件:数组容量>需要数组大小/影响因子
如果有很多数据需要储存到 HashMap 中,建议 HashMap 的容量一开始就设置成足够的大小,这样可以防止在其过程中不断的扩容,影响性能;
HashMap 是非线程安全的,我们可以自己在外部加锁,或者通过 Collections#synchronizedMap 来实现线程安全,Collections#synchronizedMap 的实现是在每个方法上加上了 synchronized 锁;
在迭代过程中,如果 HashMap 的结构被修改,会快速失败。
2新增
新增key、value大概的步骤如下:
空数组有无初始化,没有的话初始化;
如果通过 key 的 hash 能够直接找到值,跳转到 6,否则到 3;
如果 hash 冲突,两种解决方案:链表 or 红黑树;
如果是链表,递归循环,把新元素追加到队尾;
如果是红黑树,调用红黑树新增的方法;
通过 2、4、5 将新元素追加成功,再根据 onlyIfAbsent 判断是否需要覆盖;
判断是否需要扩容,需要扩容进行扩容,结束。
链表查询的时间复杂度是O(n),红黑树的查询的复杂度是O(log(n))。在链表数据不多的时候,使用链表进行遍历也比较快,只有当链表数据比较多的时候,才会转化为红黑树,但红黑树需要占用空间是链表的2倍。
共同学习,写下你的评论
评论加载中...
作者其他优质文章