赞
踩
1、hashMap
hash的基本概念是什么
任意长度的输入通过hash算法,映射成固定长度的输出
hash存在的问题
存在hash冲突,理论上无法避免,只能尽量避免
好的hash算法需要考虑哪些点
效率高、hash值尽量唯一、尽可能分散
hashmap中存储的数据结构
数组+链表+红黑树
node结构中有key、value、next、hash
初始长度
16
hashmap什么时候创建
懒加载机制,只有第一次put的时候才会创建
默认负载因子和作用
0.75 ,负载因子乘以size=扩容阈值
链表转化为红黑树需要达到什么条件
两个条件:链表长度达到8,数组长度达到64
node结构中的hash和key的hashcode的区别
h = key.hashcode
hash = h ^ h>>16 用异或可以更加散列
hash寻址算法
hash&(length - 1),其中length为数组长度,为2的幂次,所以hash & (length - 1) = hash % length
put的流程
四中情况:
第一种 slot == null,直接占用
第二种slot != null但是node没有链化, equals完全相等,直接替换,如果存在hash冲突,直接进行尾插法
第三种slot内的node已经链化,如果equals一致,替换,不一致则进行尾插法并且进行树化判断
第四种 冲突严重已经树化
红黑树继承了node结构,在node基础上增加了父节点parent ,左子节点left,右子节点right,还有颜色red
红黑树是特殊的二叉排序树,(左子节点小于当前节点,又节点大于当前节点),二分查找的方式
查找不到equals相等的点,就插入节到父节点的左子树或者右子树,然后判断是否打破平衡,进行红黑树的平衡算法
如果equals一致,进行replce操作
红黑树的五个原则
节点要么红,要么黑
根节点黑色
所有叶子节点黑色
红色节点的两个子节点都是黑色的
从任一节点到每个叶子的所有路径都包含相同数目的黑色节点
引入红黑树的原因
链表查找效率为O(n),红黑树为O(logn)
hashmap的扩容机制
记录数据量的字段达到阈值,触发扩容,tableSize << 2
扩容中的数据迁移
四种情况
第一种slot为null, 无需操作
第二种node没有链化, 根据新tableSize计算新表位置,然后存放过去
第三种node链化没有树化,拆分链表为高位链表和低位链表,低位链表位置保持不变,高位链表位置是老表位置+老表的size
第四种node存储了红黑树,拆分链表方式,不过需要注意拆分的链表长度,如果小于等于6, 转化为链表,如果大于6,保持红黑树
2、垃圾回收机制
判断对象是否是垃圾
引用计数法,执行效率高,无法检测出循环引用导致内存泄露
可达性分析, GC Root 对象:栈中引用的对象,方法区中常量引用的对象,方法区中类静态属性引用的对象,本地方法栈中JNI的引用对象
垃圾回收算法
标记-清除 碎片化
复制算法 内存占用大
标记-整理 增加整理步骤
分代收集 新生代(eden from to, MInor GC) 老年代(full gc)
垃圾收集器
新生代 单线程,多线程 老年代单线程,多线程,CMS G1
强引用、软引用(内存空间不足才回收)、弱引用(GC时被回收)和虚引用(哨兵作用)
new SoftReference WeakReference PhantomReference
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。