1.HashMap源码学习
1.低层使用数组和链表加1.8版本出的红黑树, 当有hash冲突时链表长度在大于等于8时链表会转成红黑树来存储
2.最理想的数据均匀扩散不产生链表
3.红黑树查找是O(logn)链表查找O(n)
4.为什么初始容量是要2的指数次幂? 为了运算效率; 因为在使用二进制计算数组索引时有使用&(位与)运算符, 2的次幂-1后, 一定得到
的是小于数组的length-1;hash & length-1
5.为什么加载因子是0.75? 为了时间利用率和空间利用率的最优平衡, 泊松分布的统计学算法得到的,链表8变红黑树,加载因子为0.75;
16 * 0.75 = 12, 12为扩充的时机, 如果为1那么16才扩容, 扩容过晚, 冲突几率高, 加载因子为0.5, 过早扩容, 浪费时间;
6.hash死锁: 发生在2个线程同时put数据, 数组扩容时, 链表同时反转,就会形成循环链表. get时就会发生死循环
7.put源码: 检测数组是否初始化过, 未初始化过, 容量设置为2的次幂, 计算key的hash值, 计算key的数组索引, 判断hash是否一致
hash一致, 判断key的equals, 一致就覆盖其value, 否则把当前添加的数据作为链表的第一个节点; hash不一致添加一个新的entry
2.Java虚拟机
Java虚拟机执行字节码.class文件, Java->class->机器码, 机器码可以操作系统和硬件; Java虚拟机JVM可以在不同平台运行, 然后解释成不同
平台的机器码
用法: javac
当我们想检测一个对象是否被回收了,那么我们就可以采用 Reference + ReferenceQueue,大概需要几个步骤:
创建一个引用队列 queue 创建 Refrence 对象,并关联引用队列 queue 在 reference 被回收的时候,refrence 会被添加到 queue 中